文档库 最新最全的文档下载
当前位置:文档库 › CAD VBA代码

CAD VBA代码

CAD VBA代码
CAD VBA代码

一、基本操作 (1)

1、块操作 (1)

1.1、定义块方法: (1)

1.2、把选择集加入块中的方法 (1)

1.3、插入块方法: (1)

1.4、画块属性方法 (1)

1.5、编程思路: (1)

2、画直线 (单段线) (3)

3、画多段线 (4)

3.1、修改出线点的位置 (4)

4、画圆 (4)

5、获取鼠标指定的坐标点 (4)

6、旋转 (4)

7.插入文字(单选) (5)

(1)、左边对齐: (5)

(2)、中间对齐: (5)

(3)、右边对齐 (5)

8.插入文字(多行) (5)

9、画圆弧 (6)

10、画图椭圆 (6)

11、CAD打开读取数据 (6)

12、绘制圆弧 (6)

二、CAD VBA程序答 (7)

1. VBA写的宏,可否编译成象ARX一样的程序,经加载后,在命令行打入命令后就可

运行 (7)

2. VB中可以生成可执行文件,而在VBA中却不行 (7)

5.有时文字是从别的图中复制-粘贴的,如果不打破的话,能否直接得到文字内容. (8)

GetSubEntity 方法 (8)

6. 想必河伯对Excel/ActiveX有研究, 能否请教如何获得Excel文件最后一行的信息? .8

可以用CurrentRegion属性计算最后一行 (8)

7. 如何调用vba命令对多义线进行fit(拟合)处理 (9)

8. 块属性值编辑 (9)

9.如何用程序控制对象捕捉 (10)

10. 如何从VBA到VB? (10)

11.IntersectWith 方法 (10)

12.绘制多边形并显示多边形顶点坐标 (10)

13.Private Sub AcadDocument_BeginDoubleClick(ByVal pPoint As Variant) (11)

14. 现有Handpoint = acadApp.ActiveDocument.Utility.GetPoint(, "请输入套料的插入点")

(12)

希望用户在捕捉点或输入点坐标动作时,如何避免用户因其他操作如缩放、PAN引起的系统报错 (12)

15.在VBA中如何传送一个参数给Vlisp? (12)

17.我想知道vb中的那个函数或者对象的方法可以代替在cad中按esc键取消命令 (12)

18点击菜单项就在该菜单上打对号是怎么实现的? (13)

20请问版主,如何实时获得当前光标的X,y,z坐标值,如同状态栏上显示坐标值13 21可以设置图块中的块属性值,如内 (13)

22我的选择集中有Block和PLine,我想能使用该函数 (14)

23我的机器里装有cad14和cad2000,用vb写了一个程序调用cad,如何让程序每次都调用cad2000呢? (14)

24我只是想判断一下 (14)

25SendCommand "_line" 没有返回值,怎么知道是否添加了line (15)

26为什么修改文字的对方正式后辩证文字会移回到零点? (15)

27删除块前,应先删除块的引用,怎样查找块的引用?(VBA) (15)

28使用ADO的方法如何存取ACCESS数据库? (15)

30如何将类似".5"数值改为"0.5"显示 (16)

31请问,如何将图上所有的数字(成千上万个数值)减去同一个常数? (17)

34 把选择的对象放大几倍,VBA怎么实现? (20)

35怎样提取图形的视图左下角、右上角和图形左下角,右上角的坐标? (20)

1. 怎么查找某一个group是否存在?- (21)

3. 在编程中,我遇到以下问题: (21)

5. Sheets("检测报告").Select (22)

6. 请问如何让form.hide后form.show时能保持form先前移动后的位置? (22)

9怎样计算一个多边形的中心点? (23)

10如何返回在命令行中输入的字符,是指在没有按下回车和空格下 (24)

11当我插入块时,鼠标的click_point为两个图块的公共插入点,即同时插入两个块 24 12如何把168.235642度分解成度,分,秒?我没有办法判别小数点? (24)

13. 请问在VBA中怎么使一个选择集只选中模型空间中可见图元? (25)

14. windows安装了几个打印机,如何用vb指定打印机。谢谢 (26)

16请教,VBA中的下拉列表控件的数据是怎么和数据库内的数据邦定的?我查了好些东东都不能搞定,那位仁兄可以相告,谢谢。 (26)

17请问高手,在VB中如何将如0.00000053的数字,变成形如5.3E-7字样的科学记数法 (27)

18.在vba中有IsNumberic()函数检测变量是不是数值,但我需要一个能检验所输的变量是不是字符charactor的函数,或能实现此功能的办法. (27)

19在ADDMTEXT中,换行符\p怎么使用啊? (27)

20请大家帮我解一个数学问题 (27)

22. 如何得到objectDBX及其帮助? (28)

24. 哪位大侠知道,怎么取得任意图形的中心点坐标! (28)

25测量坐标与屏幕坐标的转换 (28)

26VBA回车响应的问题 (29)

27.是根据VBA教材的代码改的批量裁剪程序 (29)

28. 我用sendcommand的_trim命令,经常剪不断,怎么办? (31)

29关于split()函数的问题 (32)

31如何在VB中开关非当前层? (34)

一、基本操作

变量可以不填可不填,在前面加入optional 如optional A as string

1、块操作

1.1、定义块方法:

Set blocksobj=ThisDrawing.Blocks.Add(基点, 块名)

1.2、把选择集加入块中的方法

ThisDrawing.CopyObjects(选择集,块)

1.3、插入块方法:

ThisDrawing.ModelSpace.InsertBlock(插入点,块名, X轴比例,Y轴比例,Z轴比例, 旋转角度)

1.4、画块属性方法

ThisDrawing.ModelSpace.AddAttribute(文字高度,模式,提示字符, 插入点, 显示字符,默认值) 一共有五种模式,在输入时会有提示,其中最常用的是“acAttributeModeNormal”普通模式

1.5、编程思路:

1.定义一个空块

2.在块中画一段弧(球服衣领)

3.画多段线,镜像画出球衣

4.画块属性,由于块属性默认的对齐方式是左对齐,而球员号码应该居中,所以必须把块的对齐属性改为居中。但是当这个属性更改时块属性对齐点会自动归零,所以不得不再次更改对齐点属性

5.把多段线和属性复制到块中

6.提示用户点选球员位置和姓名

7.插入块,修改球衣号码属性、球员姓名属性

Sub team()

Dim playerlay As AcadLayer '定义球员图层

Dim playerblock As AcadBlock '定义块变量

Dim arcc(0 To 2) As Double '圆弧圆心

Dim linep1(0 To 2) As Double '线条端点1

Dim linep2(0 To 2) As Double '线条端点2

Dim pline(0 To 20) As Double '定义队服右侧多段线7个顶点

Dim basep(0 To 2) As Double '块基点

Dim playernumberpoint(0 To 2) As Double '块属性插入点

Dim mytxt As AcadTextStyle '定义mytxt变量为文本样式

Dim blockRef As AcadBlockReference '定义块属性变量

Dim Attr3 As Variant '插入块属性变量

Set playerblock = ThisDrawing.Blocks.Add(basep, "球员") '定义一个"球员"的块

arcc(0) = 0

arcc(1) = 430

Call playerblock.AddArc(arcc, 50, ThisDrawing.Utility.AngleToReal(180, 0), 0) '画弧并加入块中

pline(0) = 0

pline(1) = 20

pline(3) = 100

pline(4) = 20

pline(6) = 100

pline(7) = 250

pline(9) = 125

pline(10) = 207

pline(12) = 212

pline(13) = 257

pline(15) = 112

pline(16) = 430

pline(18) = 50

pline(19) = 430

Set line1 = ThisDrawing.ModelSpace.AddPolyline(pline) '画队服右侧多段线

linep2(1) = 1 '镜像轴第二点位于Y轴上任一点

Set line2 = line1.Mirror(linep1, linep2) '镜像获得另一半多段线

Dim p(0 To 2) As Double '定义坐标变量

Set mytxt = ThisDrawing.TextStyles.Add("mytxt") '添加mytxt样式

mytxt.fontFile = "c:\windows\fonts\simfang.ttf" '设置字体文件为仿宋体

ThisDrawing.ActiveTextStyle = mytxt '将当前文字样式设置为mytxt

playernumberpoint(0) = 0 '块属性位置

playernumberpoint(1) = 200

Set attr1 = ThisDrawing.ModelSpace.AddAttribute(100, acAttributeModeNormal, "号码", playernumberpoint, "X", 0) '画块属性

attr1.Alignment = 7 '居中

attr1.TextAlignmentPoint = playernumberpoint '重定义对齐点

Set attr2 = ThisDrawing.ModelSpace.AddAttribute(100, acAttributeModeNormal, "姓名", playernumberpoint, "???", 0) '画块属性

attr2.Alignment = 7 '居中

Dim objCollection(0 To 3) As Object '创建选择集

Set objCollection(0) = line1 '线条1加入选择集

Set objCollection(1) = line2 '线条2加入选择集

Set objCollection(2) = attr1 '属性1加入选择集

Set objCollection(3) = attr2 '属性2加入选择集

Call ThisDrawing.CopyObjects(objCollection, playerblock) '把选择集加入块中

For Each element In objCollection '在选择集中进行循环

element.Delete '删除线条和属性(此操作并不影响已创建的块)

Next

Set playerlay = https://www.wendangku.net/doc/9a15546590.html,yers.Add("球员") '新建图层

playerlay.color = 2 '为黄色

ThisDrawing.ActiveLayer = playerlay '将当前图层设置为球员图层;

Dim p1 As Variant '块插入点位置

For i = 1 To 11 '插入块

pstring = CStr(i) & "号球员位置:

p1 = ThisDrawing.Utility.GetPoint(, pstring) '点选球员位置坐标

nstring = ThisDrawing.Utility.GetString(30, "球员姓名:")

Set blockRef = ThisDrawing.ModelSpace.InsertBlock(p1, "球员", 1, 1, 1, 0) '插入块

Attr3 = blockRef.GetAttributes '获取块属性

Attr3(0).TextString = CStr(i) '赋值球员号码

Attr3(1).TextString = nstring '赋值球员姓名

Next-

End Sub

Set mBlock = ThisDrawing.Blocks.Add(insertPt, tmpName),其中mBlock是AcadBlock 对象,insertPt是插入点的坐标(相对与块),tmpName是块的名称。

块和块的实例是两个概念。块只能有一个,但是这个块的实例却可以有很多个。

使用上述方法得到的是块,而不是块的实例。你能够在CAD菜单栏“插入-块”所打开的对话框中看到名字为tmpName的块,但是CAD图形中并没有块的图形。

Call ThisDrawing.ModelSpace.InsertBlock(Text_P, "图框B", 1, 1, 1, 0)

'(座标,X轴扩,Y轴扩,Z轴扩,旋转)

插入块。

2、画直线 (单段线)

Set ln = ThisDrawing.ModelSpace.AddLine(startPt(), EndPt())

3、画多段线

Dim p(0 To 49) As Double '定义点坐标

Set myl = ThisDrawing.ModelSpace.AddLightWeightPolyline(p) '画多段线

myl.Color = co '设置颜色属性

myl.ConstantWidth=2'设置多段线宽度属性

3.1、修改出线点的位置

Set Line2 = Line1.Mirror(CC_XYZ, CC_Mir_XYZ) '交叉线2镜像

'修改出线点的位置

a = Line2.Coordinates

a(1) = a(1) - (Phase_Number - 1 - i) * Spacing

Line2.Coordinates = a

4、画圆

拓展程序(将上述画圆的程序拓展为每画一个圆设定为一种颜色)

Sub c100()

Dim cc(0 To 2) As Double '声明坐标变量

cc(0) = 1000 '定义圆心座标

cc(1) = 1000

cc(2) = 0

Dim myl As Object '定义引用曲线对象变量

co = 15 '定义颜色

For i = 1 To 1000 Step 10 '开始循环

Set myl = ThisDrawing.ModelSpace.AddCircle(cc, i * 10) '画圆,cc数组为圆心X、Y、Z 值

myl.color = co '设置颜色属性

co = co + 1 '改变颜色,供下次定义曲线颜色

Next i

End Sub

5、获取鼠标指定的坐标点

ThisDrawing.Utility.GetPoint(, "输入点:") '获取点坐标

6、旋转

NewFilterEnt.Rotate PT, JiaoDu '更新对象 PT (基点)对你 JiaoDu 孤度

NewFilterEnt.Update

文字旋转

Set My_Text = ThisDrawing.ModelSpace.AddText(Text, Text_XYZ, Text_Hegin)

My_Text.Alignment = acAlignmentCenter '中心对齐文字acAlignmentMiddleCenter

My_Text.ScaleFactor = 0.7 '文字横竖比例

My_Text.Rotation = Pi * 90 / 180# '文字旋转角图

My_Text.TextAlignmentPoint = Text_XYZ

My_Text.color = 10 '设置颜色属性

My_Text.Rotate XYZ, Radian

My_Text.Update

Str_Number = Str_Number + 1 '下级数组

7.插入文字(单选)

Set Textobj = ThisDrawing.ModelSpace.AddText(Text, Text_P, H)

Textobj.Alignment = Text_Alignment '中心对齐文字acAlignmentMiddleCenter

'Textobj.Alignment =acAlignmentLeft

Textobj.ScaleFactor = 0.7 '文字横竖比例

Textobj.Rotation = Pi * (Rotate) / 180# '文字旋转角图(1)、左边对齐:

左上: acAlignmentTopLeft 左中:acAlignmentMiddleLeft 左下: acAlignmentBottomLeft (2)、中间对齐:

中上: acAlignmentTopCenter 正中:acAlignmentMiddleCenter 中下: acAlignmentBottomCenter (3)、右边对齐

右上: acAlignmentTopRight 右中:acAlignmentMiddleRight 右下: acAlignmentBottomRight 8.插入文字(多行)

Set txtobj = ThisDrawing.ModelSpace.AddMText(p, 1400, "{做到老,学到老}\P" & "此心自光明正大,过人远矣")

txtobj.LineSpacingFactor = 2 '指定行间距

txtobj.AttachmentPoint = 3 '右对齐(1为左对齐,2为居中)

9、画圆弧

ThisDrawing.ModelSpace.AddArc(Center, Radius, StartAngle, EndAngle)

startangle:可以根据圆心坐标和起点坐标计算出startangle

endangle:可以根据startangle和圆弧角度算出endangle

10、画图椭圆

Dim pEllipse As AcadEllipse ‘椭圆线

Dim center(0 To 2) As Double '中心点坐标

Dim p(0 To 2) As Double '相对座标以圆心为参照

Dim maj As Double, min As Double, angle As Double

Dim ratio As Double

S et pEllipse = ThisDrawing.ModelSpace.AddEllipse(center, p, min / maj) pEllipse.Rotate center, (360 - angle) * 3.1415 / 180#

#1的数据分别表示椭圆长轴,短轴,方位角,中心点坐标X,中心点坐标Y

格式如下:

11、CAD打开读取数据

Dim La As AcadLayerExcelApp.Workbooks.Open "D:\TK\龙岗索引.xls"'CASS通过VBA打开EXCEL索引文档

With ExcelApp.ActiveWorkbook.Worksheets("龙岗索引")

For i = 2 To [A65536].End(xlUp).Row '从第二行遍历EXCEL记录

th = .Range("B" & i)

If Dir("D:\DWG\" & Right(th, 5) & ".DWG") <> "" Then '判断EXCEL中图幅号对应的DWG文档是否存在,如果存在就打开

Set AcadDocTk = ThisDrawing.Application.Documents.Open("D:\TK\图框.DWG")'打开TK模板

tm = .Range("A" & i)

chdw = .Range("C" & i) '变量赋值

jd = .Range("R" & i)

sm = .Range("S" & i)

X = .Range("V" & i)

Y = .Range("U" & i)

12、绘制圆弧

R = 100(半径)

stangle = 45 * 3.14 / 180(起始位)

edangle = 135 * 3.14 / 180(结束位)

Set arcobj = ThisDrawing.ModelSpace.AddArc(center, r, stangle, edangle)

二、CAD VBA程序答

1. VBA写的宏,可否编译成象ARX一样的程序,经加载后,在命令行打入命令后就可运行

不行,必须自己写LISP加载和运行

2. VB中可以生成可执行文件,而在VBA中却不行

如果在VBA中能生成可执行文件,请问是怎样做的,不胜感激!!

VBA是不行,它只能内嵌于Autocad中运行,你可以将代码改在VB下用

3.自动加载执行VBA程序

你可以试试以下LSP函数。它与autoload的LSP函数功能一样,只要你按照它的要求写入你的执行命令名、DVB文件名及宏名就可以自动加载执行,再也不用专门写LSP程序了。(defun AutoVBALoad (cmdname project macro)

(eval

(list 'defun

(read (strcat "C:" cmdname))

nil

(list

'vl-vbarun

(strcat

project "!"

(if macro macro cmdname)

)

)

(princ)

)

)

)

你把函数复制到acad2000doc.lsp文件中,以后每写一个VBA程序,就可以通过写入一行:(AutoVBALoad <命令名> <工程文件> <宏>)

来自动调用,示例如下:

命令名为update,工程文件为myproject.dvb,模块为Foo,宏为Bar,则写为:(AutoVBALoad "UPDA TE" "MyProject.dvb" "Foo.Bar")

如果宏的位置在ThisDrawing中,则写为:

(AutoVBALoad "UPDA TE" "MyProject.dvb" "Bar")

是不是很方便。

4. 当我想添加commondialog控件时,总是无法添加,并提示:没有正确授权。(是不是我用的D版AutoCad2000的原因)。

经过重装vb6,已经可以添加commondialog控件了。

5.有时文字是从别的图中复制-粘贴的,如果不打破的话,能否直接得到文字内容. GetSubEntity 方法

它可以直接取得图元或嵌套图元的信息,取得后你就可以随便对其进行读取或更改。

语法:

object.GetSubEntity Object, PickedPoint, TransMatrix, ContextData[, Prompt]

样例:

Sub Example_GetSubEntity()

' This example prompts the user to select on object on the screen with a mouse click,

' and returns some information about the selected object.

Dim Object As Object

Dim PickedPoint As V ariant, TransMatrix As Variant, ContextData As Variant

Dim HasContextData As String

On Error GoTo NOT_ENTITY

TRYAGAIN:

MsgBox "Use the mouse to click on an entity in the current drawing after dismissing this dialog box."

' Get information about selected object

ThisDrawing.Utility.GetSubEntity Object, PickedPoint, TransMatrix, ContextData

' Process and display selected object properties

HasContextData = IIf(VarType(ContextData) = vbEmpty, " does not ", " does ")

MsgBox "The object you chose was an: " & TypeName(Object) & vbCrLf & _

"Your point of selection was: " & PickedPoint(0) & ", " & _

PickedPoint(1) & ", " & _

PickedPoint(2) & vbCrLf & _

"This object" & HasContextData & "have nested objects."

Exit Sub

6. 想必河伯对Excel/ActiveX有研究, 能否请教如何获得Excel文件最后一行的信息?

可以用CurrentRegion属性计算最后一行

CurrentSheet.Range("A1").Activate

SheetRows = ExcelApp.ActiveCell.CurrentRegion.Rows.Count '有效数据行数

7. 如何调用vba命令对多义线进行fit(拟合)处理

直接用SendCommand方法,调用命令进行编辑

8. 块属性值编辑

Public Sub GetAttribute()

'本段代码从选中的图块中获取属性值,并对其修改

Dim entObj As AcadEntity

Dim pickPnt As Variant

Dim blkRefObj As AcadBlockReference

'选择图元

ThisDrawing.Utility.GetEntity entObj, pickPnt

'判断是否为块引用

If StrComp(entObj.ObjectName, "AcDbBlockReference", 1) <> 0 Then

MsgBox "你选择的不是一个图块,程序将退出!"

'如果选择的不是一个块引用则程序退出运行

Exit Sub

End If

'如果选择的是块引用,将其赋给块引用对象

Set blkRefObj = entObj

'判断该块引用是否含有属性值

If Not blkRefObj.HasAttributes Then

MsgBox "你选择的图块没有块属性,程序将退出!"

'如果不含由属性值退出

Exit Sub

End If

Dim attVars As Variant

Dim I As Integer

'获取块引用中的块属性对象

attVars = blkRefObj.GetAttributes

'对块属性对象进行遍历

For I = 0 To UBound(attVars)

MsgBox "第" & I + 1 & "属性对象的属性值分别如下:" & Chr(13) & Chr(13) & _ "属性标签为:" & attVars(I).TagString & Chr(13) & _

"属性值为:" & attVars(I).TextString

Next

'将块属性的标签和值进行修改

attVars(0).TagString = "New Tag"

attVars(0).TextString = "New Value"

ThisDrawing.Regen True

End Sub

9.如何用程序控制对象捕捉

通过设置系统变量“osmode”来控制

10. 如何从VBA到VB?

在VB里,首先要获得Application对象,再获取Document对象,把VBA中的ThisDrawing 对象设置成该Document对象即可,这样,你开发出来的程序就可以融入VB的强大功能了。

11.IntersectWith 方法

获取图中一个对象与另一对象的交点

语法

RetVal = object.IntersectWith(IntersectObject, ExtendOption)

参数

Object 该方法适用于所有图形对象(除了Pviewport和PolygonMesh)

IntersectObject 对象,为输入项; 该对象可以是所有图形对象中的任一个。

ExtendOption AcExtendOption 枚举数; 为输入项

该选项指定两个对象是否通过延伸一个或两个或没有延伸来取得相交点。

acExtendNone 均无延伸。

acExtendThisEntity 延伸源对象。

acExtendOtherEntity 延伸作为参数传递的对象。

acExtendBoth 两个对象均延伸。

RetVal(返回值) 变体或双精度数组,返回图形中一个对象和另一对象相交的点的数组。

490

12.绘制多边形并显示多边形顶点坐标

Sub polygon()

'以下语句绘制正多边形

Dim num As Integer

Dim pnt As Variant

Dim lpnt As Variant

num = ThisDrawing.Utility.GetInteger("请选择正多边形的边数:")

Dim fpnt As Variant

fpnt = ThisDrawing.Utility.GetPoint(, "请选择正多边形的起点:")

Dim leng As Double

leng = ThisDrawing.Utility.GetDistance(fpnt, "请选择正多边形的边长:")

ReDim lpnt(0 To num * 2 - 1) As Double

pnt = fpnt

lpnt(0) = pnt(0)

lpnt(1) = pnt(1)

Dim st As Integer

For st = 1 To num - 1

pnt = ThisDrawing.Utility.PolarPoint(pnt, (3.14159265 * 2 / num) * (st - 1), leng)

lpnt(st * 2) = pnt(0)

lpnt(st * 2 + 1) = pnt(1)

Next st

Dim pgon As AcadLWPolyline

Set pgon = ThisDrawing.ModelSpace.AddLightWeightPolyline(lpnt)

pgon.Closed = True

ThisDrawing.Regen (True)

'以下语句获取多边形的顶点

Dim gpnt As Variant

gpnt = pgon.Coordinates

Dim pntcnt As Integer

pntcnt = UBound(gpnt)

Dim disptxt As String

disptxt = "多边形共有" & (pntcnt + 1) / 2 & "个顶点" & vbCrLf

Dim i As Integer

For i = 0 To pntcnt - 1 Step 2

disptxt = disptxt & "第" & i / 2 + 1 & "个顶点的坐标为:" & _

gpnt(i) & "," & gpnt(i + 1) & vbCrLf

Next i

disptxt = disptxt & "明经通道VBA示例https://www.wendangku.net/doc/9a15546590.html,"

MsgBox disptxt, , "多边形的坐标显示"

End Sub

13.Private Sub AcadDocument_BeginDoubleClick(ByVal pPoint As Variant)

MsgBox "图上双击坐标位置" & vbCrLf & pPoint(0) & vbCrLf & _

pPoint(1) & vbCrLf & pPoint(2)

Open "MyTest.txt" For Output Access Write As #1

Print #1, Format(pPoint(0), "0.000"), Format(pPoint(1), "0.000"),_

Format(pPoint(2), "0.000")

Close #1

End Sub

上面的程序只能实现将坐标输出一次,而第二次双击时,会将第一次的坐标值覆盖,有什么办法可以实现连续点选输出而不覆盖吗??????

Open 语句的Output改为Append即可

14. 现有Handpoint = acadApp.ActiveDocument.Utility.GetPoint(, "请输入套料的插入点")

希望用户在捕捉点或输入点坐标动作时,如何避免用户因其他操作如缩放、PAN 引起的系统报错

可以加一段以下语句:

on error goto errHandle

Handpoint = acadApp.ActiveDocument.Utility.GetPoint(, "请输入套料的插入点:") errhandle:

if Err.Number=-2147352567 then

Err.Clear

resume

end if

15.在VBA中如何传送一个参数给Vlisp?

如:在VBA中A = "123" , 要把VBA中A的值赋给Vlisp中的B。

用sendcommand可以做到

如:

Sub valuetolisp()

Dim a As Integer

a = 123

ThisDrawing.SendCommand "(setq b " & a & ") "

End Sub

如果不想命令行回显,则可以用VLAX控制。

16.请问在VBA中如何修改属性块中属性的textstring的对齐方式,谢了。

与Text一样,属性块也有HorizontalAlignment属性

P487

17.我想知道vb中的那个函数或者对象的方法可以代替在cad中按esc键取消命令

谢谢

SendCommand("")或SendCommand(Chr(27))

18点击菜单项就在该菜单上打对号是怎么实现的?

菜单项标签中可包括叹号和句号(!.),从而在菜单项前打上复选标记。虽然打标记的项可以被禁用,但标记一个菜单项不会使用户不能选择该项。

在下例中,Line 菜单项被打上标记。

[!.Line]

用DIESEL 来标记标签

菜单项标签中可以包含DIESEL 字符串表达式,用于判断在每次显示时,是否标记该标签。在下例中,如果与菜单标签相关的系统变量当前可用,则在该标签左边打上复选标记。[$(if,$(getvar,orthomode),!.)Ortho]^O

[$(if,$(getvar,snapmode),!.)Snap]^B

[$(if,$(getvar,gridmode),!.)Grid]^G

19图层间图形实体的移动?请问各位高手:在AutoCAD VBA中怎样通过程序实现

将一图层中的图形实体移到另一图形的图层上去

文档之间复制对象

CopyObjects方法是一个非常有用的工具。这里我们看看它是怎样在图形间复制对象。首先准备两个文档。在一个文档中,创建一些对象。如果另一个文档的名称不是Drawing1.dwg,可修改以下程序中的文档名称为你的图形名称。最后,确定激活包含有要复制对象的图形并运行以下宏,这样可以将本文档中的对象复制到名称为Drawing1.dwg的另一个文档中。Dim ss As AcadSelectionSet, doc As AcadDocument

Set doc = ThisDrawing.Application.Documents("Drawing1.dwg")

Set ss = CreateSelectionSet

ss.SelectOnScreen

ThisDrawing.CopyObjects ssArray(ss), doc.ModelSpace

20请问版主,如何实时获得当前光标的X,y,z坐标值,如同状态栏上显示坐标值

我只会在autolisp中用(grread)函数, objectarx俺不懂。

21可以设置图块中的块属性值,如内

Public Sub SetAttribute()

Dim pickPnt As Variant

Dim blkRefObj As AcadBlockReference

'选择图元,此段你可以直接将blkRefObj设为你刚插入的块

ThisDrawing.Utility.GetEntity blkRefObj, pickPnt

'判断该块引用是否含有属性值

If Not blkRefObj.HasAttributes Then

MsgBox "你选择的图块没有块属性,程序将退出!"

'如果不含由属性值退出

Exit Sub

End If

Dim attVars As Variant

Dim I As Integer

'获取块引用中的块属性对象

attVars = blkRefObj.GetAttributes

'对块属性对象进行遍历

For I = 0 To UBound(attVars)

'将块属性的值进行修改

If attVars(I)="mccad" Then

attVars(I).TextString = "明经通道"

End If

Next

ThisDrawing.Regen True

End Sub

22我的选择集中有Block和PLine,我想能使用该函数

ThisDrawing.Application.ZoomCenter Center, Magnify

Center这个点取Block的中心点或者Pline的中心点,但是不知道该怎么取这个值,高手帮帮忙吧!!!

Dim minExt As Variant

Dim maxExt As Variant

If ssetobj.Item(Me.MSHFlexGrid1.Row - 1).ObjectName = "AcDbBlockReference" Then ThisDrawing.Application.ZoomCenter ssetobj.Item(Me.MSHFlexGrid1.Row - 1).InsertionPoint, 40

Else

ssetobj.Item(Me.MSHFlexGrid1.Row - 1).GetBoundingBox minExt, maxExt

ThisDrawing.Application.ZoomWindow minExt, maxExt

ThisDrawing.Application.ZoomScaled 0.5, acZoomScaledRelative End If

23我的机器里装有cad14和cad2000,用vb写了一个程序调用cad,如何让程序每次都调用cad2000呢?

Set acadApp = GetObject(, "AutoCAD.Application.15")

24我只是想判断一下

因为我想画一条多段线,就要用到多个Getpoint,但是我不知道具体要话多少段,只是联系

两点的线,我觉得如果可以象autocad里面画线那样就可以了阿

我现在是在画地理图上面的电线,是折线嘛!

然后捕捉错误来退出while。

对于取得的点可以通过数组来保存,而数组也可以用redim来重新定义

25SendCommand "_line" 没有返回值,怎么知道是否添加了line

在使用该方法前及后看看数据库中最后一个对象是否相同

26为什么修改文字的对方正式后辩证文字会移回到零点?

在设置了文字的对齐方式(Alignment)后,应该用文本对齐位置(TextAlignmentPoint)重新指定对齐点,否则缺省(即默认)的对齐点为原点。

因为不同的文字方式文字的插入点会有所不同,所以必须计算文字插入点后,一同修改.

27删除块前,应先删除块的引用,怎样查找块的引用?(VBA)

函数如下:

'删除块引用

Public Sub DeleteBlockRef(ByVal Name As String)

Dim EntObj As AcadEntity

On Error GoTo ErrTrap

If Name = "" Then Exit Sub

For Each EntObj In ThisDrawing.ModelSpace

If StrComp(EntObj.ObjectName, "AcDbBlockReference", vbTextCompare) = 0 Then If StrComp(https://www.wendangku.net/doc/9a15546590.html,, Name, vbTextCompare) = 0 Then

EntObj.Delete

End If

End If

Next

Set EntObj = Nothing

Exit Sub

ErrTrap:

If Not (EntObj Is Nothing) Then Set EntObj = Nothing

On Error GoTo 0

End Sub

28使用ADO的方法如何存取ACCESS数据库?

ADO数据库读取有很多办法,在这告诉你一个比较简单的。

Dim db As Database '在ACAD VBA中,ACAD图形数据库也用Database类,你须在工程中引用Microsoft DAO 3.51 Object Library库,并将其优先级提高到仅次于AutoCAD类型库。Dim rst As Recordset 'rst为数据库记录集对象

Set db=DBEngine.Workspaces(0).OpenDatabase(FileName) 'FileName为你的*.mdb数据库文件名(全路径)。

Set rst = db.OpenRecordset("SELECT * FROM Table1;") 'Table1为数据库的表名。

此后,你可以用rst.MoveFirst,rst.MoveNext,rst.MoveLast等方法移动记录指针,用rst.Fields(FieldsName).Value获取FieldsName字段的内容。

不知道是否已明白你的意图,ADO连接方法:

Dim cn As Connection

Set cn = New Connection

cn.CursorLocation = adUseClient

cn.Open "PROVIDER=Microsoft.Jet.OLEDB.3.51;Data Source=" &_

YourMdbPathName

Dim cmd As New https://www.wendangku.net/doc/9a15546590.html,mand

Set cmd.ActiveConnection = cn

https://www.wendangku.net/doc/9a15546590.html,mandText = YourSQLString

Dim rst As New ADODB.Recordset

rst.CursorLocation = adUseClient

rst.Open cmd,adOpenStatic,adLockBatchOptimistic

29在Mtext的文字內容中,原始數據的1項為文字內容,但有時會包含一些格式:如(1 ."\\A1;Here),(1 . "\\C2;There).....等等,我知道,\\p是換行,\\c是表顏色,但\\a 就不知道,哪位可提供詳細的全部資料,或以從哪里可得到?先謝了

格式化多行文字

\O...\o 打开或关闭上划线

\L...\l 打开或关闭下划线

\~ 插入不断开空格

\\ 插入反斜杠

\{...\} 插入开始或结束大括号

\F文件名更改为指定的字体文件

\H值; 按图形单位更改文字高度

\H值x; 更改文字高度为当前文字高度的倍数

\S...^...; 堆叠在\u12289、#或^符号后的文字

\T值; 从0.75到4倍之间调整字符的间隔

\Q角度; 更改倾斜角度

\W值; 更改宽度因子以产生较宽的文字

\A值; 设置对齐值;有效值如下:0(底对齐)、1(中间对齐)、2(顶对齐)

\P 换行

30如何将类似".5"数值改为"0.5"显示

在VB中可直接用Format函数。

如:保存小数点后两位,可以用Format(1.23456,".00")=1.23,

如果点号之前补零的话,只要Format(0.23456,"0.00")=0.23。

31请问,如何将图上所有的数字(成千上万个数值)减去同一个常数?

这段程序提示你选择文本,然后指定增量,正的就是加,负的就是减了。如果选中的文本是数字的,那么就对它进行加或减处理。

Sub Test()

Dim SSetObj As AcadSelectionSet

Dim bFound As Boolean

Dim IncreaseValue As Double

Dim i As Integer

On Error GoTo ErrTrap

For Each SSetObj In ThisDrawing.SelectionSets

If https://www.wendangku.net/doc/9a15546590.html, = "ChangeText" Then

bFound = True

Exit For

End If

Next

If bFound = False Then

Set SSetObj = ThisDrawing.SelectionSets.Add("ChangeText")

Else

Set SSetObj = ThisDrawing.SelectionSets("ChangeText")

SSetObj.Clear

End If

SSetObj.SelectOnScreen

If SSetObj.Count = 0 Then Exit Sub

IncreaseValue = ThisDrawing.Utility.GetReal("指定数值增量: ")

For i = 0 To SSetObj.Count - 1

If TypeOf SSetObj(i) Is AcadText Or TypeOf SSetObj(i) Is AcadMText Then

If IsNumeric(SSetObj(i).TextString) Then

SSetObj(i).TextString = SSetObj(i).TextString + IncreaseValue

End If

End If

Next

SSetObj.Delete

Set SSetObj = Nothing

Exit Sub

ErrTrap:

If Not (SSetObj Is Nothing) Then Set SSetObj = Nothing

On Error GoTo 0

End Sub

475

32想写一个批量插入文件的程序,能调用所需用到的电子地图,以简化工作(不需要一幅一幅的进行插入),但不知道从哪里开始着手,请教高人指点!!

多DWG文件选择及选择整个目录下的DWG文件进行插入的例子如内

首先工程中必须使用“CommonDialog-在VBA中使用的公用对话框模块”,见以下链接:https://www.wendangku.net/doc/9a15546590.html,/mcdown/list.asp?id=83 开始工程前应输入CommonDialog.cls文件及modConstants.bas文件。程序如下:'通过选定多个图形文件插入到图形中的过程Sub IntBlkBySelectDwg() On Error GoTo Err_Control Dim BlkFile As Variant Dim i As Integer Dim InstPnt As Variant Dim BlkRefObj As AcadBlockReference Dim varCancel As Variant BlkFile = getFileBySelect("选择图形:", "dwg", "AutoCAD图形文件(*.dwg)|*.dwg") If IsArray(BlkFile) Then ThisDrawing.Utility.Prompt vbCrLf & " 你选定了" & Str(UBound(BlkFile) + 1) & "个图形" For i = 0 To UBound(BlkFile) InstPnt = ThisDrawing.Utility.GetPoint(, vbCrLf & " 请选择图形" & JustFileName(BlkFile(i)) & " 的插入点:") Set BlkRefObj = ThisDrawing.ModelSpace.InsertBlock(InstPnt, _ BlkFile(i), 1#, 1#, 1#, 0#) Next End If Exit_Here: Exit Sub Err_Control: Select Case Err.Number Case -2147352567 varCancel = ThisDrawing.GetVariable("LASTPROMPT") If InStr(1, varCancel, "*Cancel*") <> 0 And InStr(1, varCancel, "*取消*") <> 0 Then Err.Clear Resume Exit_Here Else Err.Clear Resume End If Case -2145320928 Err.Clear Resume Exit_Here Case Else Resume Exit_Here End Select End Sub '通过选定整个目录中的图形文件插入到图形中的过程Sub IntBlkByDirDwg() On Error GoTo Err_Control Dim BlkFile As Variant Dim i As Integer Dim InstPnt As Variant Dim BlkRefObj As AcadBlockReference Dim varCancel As Variant BlkFile = GetDir("选择要插入图形所在的目录:", "*.dwg") If IsArray(BlkFile) Then ThisDrawing.Utility.Prompt vbCrLf & " 你选定了" & Str(UBound(BlkFile) + 1) & "个图形" For i = 0 To UBound(BlkFile) InstPnt = ThisDrawing.Utility.GetPoint(, vbCrLf & " 请选择图形" & JustFileName(BlkFile(i)) & " 的插入点:") Set BlkRefObj = ThisDrawing.ModelSpace.InsertBlock(InstPnt, _ BlkFile(i), 1#, 1#, 1#, 0#) Next End If Exit_Here: Exit Sub Err_Control: Select Case Err.Number Case -2147352567 varCancel = ThisDrawing.GetVariable("LASTPROMPT") If InStr(1, varCancel, "*Cancel*") <> 0 And InStr(1, varCancel, "*取消*") <> 0 Then Err.Clear Resume Exit_Here Else Err.Clear Resume End If Case -2145320928 Err.Clear Resume Exit_Here Case Else Resume Exit_Here End Select End Sub '选定多个文件的函数,使用了CommonDialog类Public Function getFileBySelect(DialogTitle, DefaultExt, Filter) As Variant Dim dlg As CommonDialog Dim Files As Variant Dim i As Integer Set dlg = New CommonDialog With dlg .DialogTitle = DialogTitle .DefaultExt = DefaultExt .Filter = Filter .Flags = OFN_EXPLORER Or OFN_HIDEREADONLY Or OFN_ALLOWMULTISELECT If .ShowOpen Then getFileBySelect = .ParseFileNames End If End With End Function '返回指定目录下指定名称所有文件的函数Function GetFileListByPath(Path As String, FileName As String) As Variant Dim s As String Dim sFiles() As String Dim i As Integer s = Dir(Path & FileName) If s <> "" Then ReDim sFiles(i) As String sFiles(i) = Path & s i = 1 s = Dir() While s <> "" ReDim Preserve sFiles(i) As String sFiles(i) = Path & s i = i + 1 s = Dir() Wend GetFileListByPath = sFiles End If End Function '选定目录的函数,使用了commonDialog类Public Function GetDir(DialogTitle As String, FileName As String) As Variant Dim dlg As CommonDialog Dim Path As String Dim FileList As Variant Set dlg = New CommonDialog

服务器端与客户端建立并连接小Demo

服务器端代码: using https://www.wendangku.net/doc/9a15546590.html,; using https://www.wendangku.net/doc/9a15546590.html,.Sockets; Static void Main(string[] args){ Socket serverSocket=new Socket(AddressFamily.InterNetWork,SocketType.Stream,ProtocalTy pe.TCP); //new一个Socket对象,注意这里用的是流式Socket(针对于面向连接的TCP服务应用)而不是数据报式Socket(针对于面向无连接的UDP服务应用)。 IPAddress serverIP=IPAddress.Parse("127.0.0.1"); int port=2112; IPEndPoint ipEndPoint=new IPEndPoint(serverIP,port);//网络节点对象 serverSocket.Bind(ipEndPoint);//将结点绑定到套接字上 serverSocket.Listen(10);//设置连接队列的最大长度,可根据服务器的性能,可以设置更大程度。 Console.WriteLine("服务器已就绪准备客户端连接。。。。"); while(true){//循环监听端口,得到客户端连接 Socket socket=serverSocket.Accept();//当有客户端连接时,就产生一个socket实例 SessionServer sserver=new SessionServer(socket);//将socket实例传入到消息处理类中 Thread t=new Thread(sserver.GetClientMsg);//当有一个客户端连接,就启动一个线程来处理此客户端的消息 t.Start();

简单的web服务器源代码

#include "stdafx.h" #include "Websys.h" #include "WebsysDlg.h" #include #include #include #include #include #include #include #include #include #include #define Lnumber 5 //监听队列长度#define max1 1024 #define max2 1024*1024 #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //全局变量 unsigned long IP;//用于存储IP地址int port; //用于存储接口号char mainfile[128]; //用于存储主目录int Tnumber=0; //列表控件序号

int tnumber; //每次开启服务器的进程数 int stop; //服务器状态,0表示关闭状态,1表示开启状态CString mm_error; SOCKET Lsock; //监听socket CCriticalSection slock;//线程互斥信号 //全局函数 static UINT listen_sock(LPVOID n);//创建监听的sock static UINT get_sock(LPVOID n);//建立连接,进行报文和文件的传输 class websock { public: CWebsysDlg *dlg1; }; class saddr { public: SOCKET sockr; sockaddr_in *addr; }; websock ws;//全局主窗口类型变量 // 帮助对话框的类的定义及封装函数

IBM_x系列服务器报错代码

适用机型: 所有服务器 以下报错信息,只是对目前大部分X系列服务器适用的报错信息。仅供参考,如果服务器使用过程中发生橘黄色感叹号灯常亮,或者服务器停止在自检过程中,建议客户尽快跟IBM 技术服务人员联系。 错误代码/症状FRU/操作 062(使用缺省配置的连续三次引导失败。) 1. 运行Configuration/Setup Utility 程序 2. 电池 3. 主板 4. 微处理器 101、102、106(计时器时标中断失败)* 主板 102(计时器2 测试失败)* 主板 106(软盘控制器错误)* 主板 129(内置高速缓存(L1)错误) 1. 可选微处理器 2. 微处理器 151(实时时钟错误) 1. 电池 2. 主板 161(实时时钟电池错误) 1. 运行Configuration/Setup Utility 程序 2. 电池 3. 主板 162(设备配置错误) 注:请务必装入缺省设置和任何期望的其它设置; 然后,保存配置 1. 运行Configuration/Setup Utility 程序 2. 电池 3. 发生故障的设备 4. 主板 163 (实时时钟错误) 1. 运行Configuration/Setup Utility 程序 2. 电池 3. 主板 164 (内存配置更改。) 1. 运行Configuration/Setup Utility 程序 2. DIMM 3. 主板 175 (EEPROM CRC #1 损坏)* 主板 184 (开机密码损坏) 1. 运行Configuration/Setup Utility 程序 2. 主板

185 (驱动器启动顺序信息毁坏) 1. 运行Configuration/Setup Utility 程序 2. 主板 187 (VPD 序列号未设置) 1. 运行Configuration/Setup Utility 程序 2. 主板 188 (EEPROM CRC #2 损坏) 1. 运行Configuration/Setup Utility 程序 2. 主板 189 (试图以无效密码进入系统) 1. 运行Configuration/Setup Utility 程序 2. 主板 196 (微处理器高速缓存不匹配) 1. 确保微处理器为相同的类型和速度 2. 微处理器 198 (微处理器速度不匹配) 1. 确保微处理器为相同的类型和速度 2. 微处理器 199 (微处理器未按建议进行配置) 1. 确保微处理器为相同的类型和速度 2. 微处理器 201 (内存测试错误) 1. DIMM 2. 主板 229 (内置高速缓存(L2)错误) 1. 微处理器 2. 后添加微处理器 289 (用户或系统禁用了DIMM) 1. 运行Configuration/Setup Utility 程序 2. DIMM 3. 主板 301 (键盘或键盘控制器错误) 1. 键盘 2. 主板 303 (键盘控制器错误) 1. 将PS/2 键盘更换为USB 键盘 2. 主板 602 (无效的软盘引导记录) 1. 软盘 2. 软盘驱动器 3. 驱动器电缆 4. 主板 604 (软盘驱动器错误) 1. 运行Configuration/Setup Utility 程

web服务器和应用服务器

WEB服务器与应用服务器的区别: 1.WEB服务器: 理解WEB服务器,首先你要理解什么是WEB?WEB你可以简单理解为你所看到的HTML页面就是WEB的数据元素,处理这些数据元素的应用软件就叫WEB服务器,如IIS、apache。 WEB服务器与客户端打交道,它要处理的主要信息有:session、request、response、HTML、JS、CS等。 2.应用服务器: 应用服务器如JSP,处理的是非常规性WEB页面(JSP文件),他动态生成WEB 页面,生成的WEB页面在发送给客户端(实际上当应用服务器处理完一个JSP 请求并完成JSP生成HTML后它的任务就结束了,其余的就是WEB处理的过程了)。 WEB服务器与应用服务器的联系: 1.WEB服务器一般是通用的,而应用服务器一般是专用的,如Tomcat只处理Java应用程序而不能处理ASPX或PHP。而Apache是一个WEB服务器f(HTTP 服务器),后来连接Tomcat应用服务器来支持java。 二、另述 WEB服务器、应用程序服务器、HTTP服务器有何区别?IIS、Apache、Tomcat、Weblogic、WebSphere都各属于哪种服务器,这些问题困惑了很久,今天终于梳理清楚了: Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL。与客户端的网络浏览器配合。因为Web服务器主要支持的协议就是HTTP,所以通常情况下HTTP服务器和WEB服务器是相等的(有没有支持除HTTP之外的协议的web服务器,作者没有考证过),说的是一回事。 应用程序服务器(简称应用服务器),我们先看一下微软对它的定义:"我们把应用程序服务器定义为“作为服务器执行共享业务应用程序的底层的系统软件”。就像文件服务器为很多用户提供文件一样,应用程序服务器让多个用户可以同时使用应用程序(通常是客户创建的应用程序)" 通俗的讲,Web服务器传送(serves)页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序可以调用(call)的方法(methods)。确切一点,你可以说:Web服务器专门处理HTTP请求(request),但是应用程序服务器是通过很多协议来为应用程序提供(serves)商业逻辑 (business logic)。

基于C语言的Socket编程服务器端测试代码

#include #include int main() { WSADATA wsaData; SOCKET ServerSock; SOCKET sockConn; SOCKADDR_IN localaddr; SOCKADDR_IN addrClient; char sendBuf[100] = {'1', '2', '3'}; char recvBuf[100]; int addrlen = sizeof(struct sockaddr_in); if (WSAStartup(MAKEWORD(2,2),&wsaData) != 0) { printf("初始化失败!\n"); } localaddr.sin_family = AF_INET; localaddr.sin_addr.S_un.S_addr = inet_addr(5000); localaddr.sin_port = htons("127.0.0.1"); // memset(ser_addr.sin_zero,0,8); ServerSock = socket(2, 100, 0); if(ServerSock == INV ALID_SOCKET) { printf("invalid socket !\n"); return 0; } bind(ServerSock, (struct sockaddr*)&localaddr, sizeof(struct sockaddr_in)); listen(ServerSock, 2); while(1) { sockConn=accept(ServerSock, (SOCKADDR*)&addrClient, &addrlen); if (sockConn != INV ALID_SOCKET) { sprintf(sendBuf,"Welcome %s to 刘洼村",inet_ntoa(addrClient.sin_addr));

使用OPENSSL编写服务器和客户端代码实例

使用OPENSSL编写服务器和客户端代码实例使用相同的ca生成两个证书,一个是server.cer,一个是client.cer,注意生成server.cer的时候必须指明证书可以用于服务端的。 服务器代码: 1.#include "openssl/bio.h" 2.#include "openssl/ssl.h" 3.#include "openssl/err.h" 4. 5.#include 6. 7.#define EXIT_IF_TRUE(x) if (x) \ 8. do { \ 9. fprintf(stderr, "Check '%s' is true\n", #x); \ 10. ERR_print_errors_fp(stderr); \ 11. exit(2); \ 12. }while(0) 13. 14.int main(int argc, char **argv) 15.{ 16. SSL_CTX *ctx; 17. SSL *ssl; 18. X509 *client_cert; 19. 20. char szBuffer[1024]; 21. int nLen; 22. 23. struct sockaddr_in addr; 24. int len; 25. int nListenFd, nAcceptFd; 26. 27.// 初始化 28. cutil_init(); 29. cutil_log_set_level(LOG_ALL); 30. cutil_log_set_stderr(1);

31. SSLeay_add_ssl_algorithms(); 32. OpenSSL_add_all_algorithms(); 33. SSL_load_error_strings(); 34. ERR_load_BIO_strings(); 35. 36.// 我们使用SSL V3,V2 37. EXIT_IF_TRUE((ctx = SSL_CTX_new (SSLv23_method())) == NULL); 38. 39.// 要求校验对方证书 40. SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); 41. 42.// 加载CA的证书 43. EXIT_IF_TRUE (!SSL_CTX_load_verify_locations(ctx, "cacert.cer", NULL)); 44. 45.// 加载自己的证书 46. EXIT_IF_TRUE (SSL_CTX_use_certificate_file(ctx, "server.cer", SSL_FILETYPE_PEM ) <= 0) ; 47. 48.// 加载自己的私钥 49. EXIT_IF_TRUE (SSL_CTX_use_PrivateKey_file(ctx, "server.key", SSL_FILETYPE_PEM) <= 0) ; 50. 51.// 判定私钥是否正确 52. EXIT_IF_TRUE (!SSL_CTX_check_private_key(ctx)); 53. 54.// 创建并等待连接 55. nListenFd = cutil_socket_new(SOCK_STREAM); 56. cutil_socket_bind(nListenFd, NULL, 8812, 1); 57. 58. memset(&addr, 0, sizeof(addr)); 59. len = sizeof(addr); 60. nAcceptFd = accept(nListenFd, (struct sockaddr *)&addr, (size_t *)&len); 61. cutil_log_debug("Accept a connect from [%s:%d]\n", 62. inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); 63. 64.// 将连接付给SSL 65. EXIT_IF_TRUE( (ssl = SSL_new (ctx)) == NULL); 66. SSL_set_fd (ssl, nAcceptFd); 67. EXIT_IF_TRUE( SSL_accept (ssl) != 1); 68. 69.// 进行操作 70. memset(szBuffer, 0, sizeof(szBuffer)); 71. nLen = SSL_read(ssl,szBuffer, sizeof(szBuffer)); 72. fprintf(stderr, "Get Len %d %s ok\n", nLen, szBuffer);

简单http服务器代码

/* 基于流式套接字C/S结构的服务器端。 通信规程: 1、客户端连接到服务器以后,向服务器端发送命令 2、服务器解析命令的正确性,对于错误的命令,向客户端发送"Bad Command"的响应信息。 3、客户端主动断开连接,通过发送Quit命令实现。 4、服务器端在服务过程中,检测到错误后断开连接。 说明: 1、服务器工作在单线程select模型,所有处理都在main()中进行。 2、在该模式下,服务器并发为多个客户端提供服务 3、和基于非阻塞模式的单线程并发服务程序的区别是: 不要求套接字工作在非阻塞模式。 */ //添加必要的头文件 //#define FD_SETSIZE 20 #include #include #define MAX_CLIENT_COUNT FD_SETSIZE-1 //用这种方式添加链接库信息 #pragma comment(lib,"ws2_32") //服务器默认工作在7777端口,所有IP地址接收的连接请求都处理 #define DEFAULTPORT 7777 //接收、发送缓冲区大小 #define SIZE_INBUF 1024 #define SIZE_OUTBUF 1024 #define HTTP_SERVER_OUTPUT_HEAD "HTTP/1.1 200 OK\r\n" "Date: Wed,22nov 2000 02:44:34 GMT\r\n" "Server: Windows\r\n" "Last-Modified: Tue, 18 Apr 2000 13:24:10 GM T\r\n" "Accept-Ranges: bytes\r\n" "Content-Length: 121\r\n" "Connection: close\r\n" "Content-Type: text/html; charset=US-ASCII\r\n\r\n" #define METHOD_NOT_IMPLEMENTED "test

Hello Word!

\r\n\r\n" int main(void) { //1 准备WinSock执行环境 WORD ver=MAKEWORD(2,2); WSADATA wsdata;

基于TCP的服务器客户端编程讲解

西北师范大学计算机科学与工程学院 学生实验报告 学号日期 : 系别计算机科学与 工程学院 专业班级姓名 课程名称课程 类型 学时数 2 实验 名称 实验二、基于TCP的服务器/客户端编程 实验目的:1、掌握Linux下的TCP客户端基本原理和基本编程方法 实验内容: 1、写Linux下TCP服务器套接字程序,程序运行时服务器等待客户的连接,一旦连接成功,则显示客户的IP地址、端口号,并向客户端发送字符串。 2、写Linux下TCP客户端套接字程序,结合TCP的服务器端程序,实现以下功能: (1)、客户根据用户提供的IP地址连接到相应的服务器; (2)、服务器等待客户的连接,一旦连接成功,则显示客户的IP地址、端口号,并向客户端发送字符串; (3)、客户接收服务器发送的信息并显示。 实验步骤: 一、TCP服务端程序设计

使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信,它分为服务器端和客户端两部分,其主要实现过程如图所示。 图1.1 TCP客户/服务器的套接字函数 1、socket函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。 #include int socket(int family,int type,int protocol); 返回:非负描述字---成功-1---失败 第一个参数指明了协议簇,目前支持5种协议簇,最常用的有 AF_INET(IPv4协议)和AF_INET6(IPv6协议);第二个参数指明套接口类型,有三种类型可选:SOCK_STREAM(字节流套接口)、SOCK_DGRAM(数据报套接口)和SOCK_RAW(原始套接口);如果套接口类型不是原始套接口,那么第三个参

聊天系统(客户端、服务器端) java版 完整代码

客户端: import java.awt.*; import java.awt.event.*; import java.io.*; import https://www.wendangku.net/doc/9a15546590.html,.*; public class ChatClient extends Frame { Socket s = null; DataOutputStream dos = null; DataInputStream dis = null; private boolean bConnected = false; TextField tfTxt = new TextField(); TextArea taContent = new TextArea(); Thread tRecv = new Thread(new RecvThread()); public static void main(String[] args) { new ChatClient().launchFrame(); } public void launchFrame() { setLocation(400, 300); this.setSize(300, 300); add(tfTxt, BorderLayout.SOUTH); add(taContent, BorderLayout.NORTH); pack(); this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent arg0) { disconnect(); System.exit(0); } }); tfTxt.addActionListener(new TFListener()); setVisible(true); connect(); tRecv.start(); }

android和服务器的代码+步骤详细

Android JSON网络数据交换 2011-10-30 13:33:33 我来说两句 收藏我要投稿 [字体:小大] 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成,非常适合于服务器与客户端的交互。JSON采用与编程语言无关的文本格式,但是也使用了类C语言的习惯,这些特性使JSON成为理想的数据交换格式。 和XML 一样,JSON 也是基于纯文本的数据格式。由于JSON 天生是为JavaScript 准备的,因此,JSON 的数据格式非常简单,您可以用JSON 传输一个简单的String,Number,Boolean,也可以传输一个数组,或者一个复杂的Object 对象。 首先创建一个Web项目ServletTest 1:我们创建一个名为User的JavaBean作为用户对象类,用来保存演示数据 2:我们创建一个ServletDemo的Servlet类作为服务器的接口程序

3:把该Servlet部署到Tomcat下,发布项目需要修改web.xml 4:发布成功后,在浏览器输入地址http://localhost:8080/ServletTest/Test,输出如下结果: 5:准备好服务器的接口后,我们准备写客户端的程序,创建一个android项目 我们创建一个名为JSONActivity的Activity类 首先我们修改UI布局layout/main.xml 6:实现客户端获取网络数据的核心代码:

因为要访问外部网络,所以要子啊AndroidManifest.xml文件里增加一行安全许可:

基于tcp的客户端服务器程序代码

服务器端程序 // TODO: Add extra initialization here addr.sin_family=AF_INET; //TCP– IPv4 addr sin_port=htons(8090); //指定端口号,动态端口的范围从1024到65535,这里使用8090 addr.sin_addr.S_un.S_addr=INADDR_ANY; /*机器上可能有多块网卡,也就有多个IP地址, 如果指定为INADDR_ANY,那么系统将绑定默认的网卡即IP地址*/ s=::socket(AF_INET,SOCK_STREAM,0); //利用socket函数创建套接字 ::bind(s,(sockaddr*)&addr,sizeof(addr)); //调用bind函数把套接字s绑定到本地地址和指定端口号上 ::listen(s,5); //s监听网络中的所有客户机 ::WSAAsyncSelect(s,this->m_hWnd,WM_SOCKET,FD_ACCEPT|FD_READ); //接收读和连接通知 GetDlgItem(IDC_TEXT)->EnableWindow(true); //激活编辑框显示 GetDlgItem(IDC_ADDR)->SetWindowText("服务器开始监听!"); void CTCPDlg::OnSocket(WPARAM wParam,LPARAM lParam) { CString str; CString str13; CString str14; unsigned short int str15; char cs[100]={0}; switch (lParam) //响应通知

服务器返回状态码大全

服务器返回状态码大全 服务器返回状态码 本文摘自:https://www.wendangku.net/doc/9a15546590.html,/531758291/blog/item/b6d4dd1b2de1a15443a9addf.html 服务器返回的各种状态码到底表示什么意思呢,哪些说明没有问题,哪些返回状态是出问题了,这个返回状态码表示的是什么意思,下面是服务器各种返回状态码的意义: 100(继续)请求者应当继续提出请求。服务器返回此代码则意味着,服务器已收到了请求的第一部分,现正在等待接收其余部分。 101(切换协议)请求者已要求服务器切换协议,服务器已确认并准备进行切换。 200(成功)服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。如果您的robots.txt 文件显示为此状态,那么,这表示Googlebot 已成功检索到该文件。 201(已创建)请求成功且服务器已创建了新的资源。 202(已接受)服务器已接受了请求,但尚未对其进行处理。 203(非授权信息)服务器已成功处理了请求,但返回了可能来自另一来源的信息。 204(无内容)服务器成功处理了请求,但未返回任何内容。 205(重置内容)服务器成功处理了请求,但未返回任何内容。与204 响应不同,此响应要求请求者重置文档视图(例如清除表单内容以输入新内容)。 206(部分内容)服务器成功处理了部分GET 请求。 300(多种选择)服务器根据请求可执行多种操作。服务器可根据请求者(User agent) 来选择一项操作,或提供操作列表供请求者选择。 301(永久移动)请求的网页已被永久移动到新位置。服务器返回此响应(作为对GET 或HEAD 请求的响应)时,会自动将请求者转到新位置。您应使用此代码通知Googlebot 某个网页或网站已被永久移动到新位置。 302(临时移动)服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。此代码与响应GET 和HEAD 请求的301 代码类似,会自动将请求者转到不同的位置。但由于Googlebot 会继续抓取原有位置并将其编入索引,因此您不应使用此代码来通知Googlebot 某个页面或网站已被移动。 303(查看其他位置)当请求者应对不同的位置进行单独的GET 请求以检索响应时,服务器会返回此代码。对于除HEAD 请求之外的所有请求,服务器会自动转到其他位置。 304(未修改)自从上次请求后,请求的网页未被修改过。服务器返回此响应时,不会返回网页内容。

Android手机端服务器代码编写规范

Android手机端服务器代码编写规范 1.建包规范: 目录结构: 包名以https://www.wendangku.net/doc/9a15546590.html,域名为前缀,字母全小写: biz包是义务逻辑包,各个相关的业务逻辑实现类存放在此包 dao包是数据连接对象类得接口包,dao对象的interface存在此包 daoSqlServerImpl包是数据连接对象的实现类包,操作数据库的具体实现存在此包 entity是实体类包,各个包含具体属性和字段的实体对象存放在此包 exception是异常包,自定义的异常类的存放 servlet是servlet请求处理包,自定义的servlet类的存放 utils是工具类包,需要全局使用的工具类存放此包 目前使用这些包,按需求可添加包 2.建类规范 以英文定义(尽量做到见名知意),首字母大写 组合词每个单词首字母大写 避免使用缩写单词(除组合单词或单词超长,或其缩写已经广为人知(如HTTP)) 每个相关联的对象最好友一致的规范例如: entity dao daoSqlServerImpl biz exception TabUser TabUserDAO TabUserDAOImpl TabUserBiz TabUserException servlet utils(存放全局工具) LoginServlet/UploadImgServlet JdbcSqlServer (连接数据库) 3.方法定义规范 增:addTabUser(不同参数类型使用重载) 删:delTabUserById()<删除TabUser通过Id> delTabUserByName()<删除TabUser通过Name> 改:updateTabUserById() 查:根据Id查询用户getTabUserById(),查询全部用户getAllTabUser() 标准:add/del/update/get+对象名+By(没有条件可不写By)+使用条件

JAVA编写服务器和客户端

1、服务器 程序代码如下: import java.io.*; import https://www.wendangku.net/doc/9a15546590.html,.*; import java.awt.*; import java.awt.event.*; public class aaa extends Frame implements ActionListener { Label label = new Label("交谈内容"); Panel panel = new Panel(); TextField tf = new TextField(10); TextArea ta = new TextArea(); ServerSocket server; Socket client; InputStream in; OutputStream out; public aaa() { super("服务器"); setSize(80, 80); panel.add(label); panel.add(tf); tf.addActionListener(this); add("West", panel); add("Center", ta); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); show(); try { server = new ServerSocket(4000); client = server.accept(); ta.append("客户机端:" + client.getInetAddress().getHostName() + "\n\n"); in =client.getInputStream(); out= client.getOutputStream(); } catch (IOException ioe) { } while (true) { try { byte[] buf = new byte[256]; in.read(buf); String str = new String(buf); ta.append("服务器端:" + str + "\n\n"); } catch (IOException e) { } } } public void actionPerformed(ActionEvent e) { try { String str = tf.getText(); byte[] buf = str.getBytes();

FTP服务器 详解+源代码

一个简单的FTP服务器 实例目标 FTP是网络上共享资源的常用方法,在本章中我们将实现一个简单的FTP服务器。 本章知识点: ●FTP协议 ●Socket类和TcpListener类 ●System.Threading 名称空间 5.1 实例功能 本实例实现一个简单的FTP服务器,该服务器是一个控制台程序,编译后的可执行文件为ftpd.exe,在控制台中键入ftpd后就可启动服务器,若要改变ftp服务器的工作目录,可以键入ftpd –r 后接绝对路径。 服务器的ftp服务端口采用默认的21。服务器启动后,用户就可从其他任何一台联网计算机进行访问。下面是应用的一个例子:(服务器所在机器的ip为166.111.147.25)用户在自己计算机的控制台中输入ftp 166.111.147.25 回车后可以看到服务器传过来的欢迎信息,并要求输入登陆账号(图5-1)。 图5-1 登陆ftp

精品 感谢下载载 输入用户名和密码后(为简化起见我们在程序中省去了验证过程,任何人都可以登陆),用户的控制台如图5-2所示,在服务器上,也出现了该用户的登陆情况(图5-3)。 图5-2 成功登陆 图5-3 服务端 接下来用户可以使用各种命令进行各种ftp 操作,比如列出目录下所有文件和文件夹 (ls ),下载指定的文件(get ),上载文件(put )等等。下面是客户端(图5-4)和服务端(图5-5)某时刻的运行状态。 图5-4 客户端运行情况图 5-5 服务端运行情况 5.2 编程思路 要实现FTP 服务器,我们必须对FTP 协议有一定的了解,使用符合协议的指令集和网络 传输方式,我们将在下一节详细介绍关于FTP 协议的基础知识。另外,我们还采用了

FTP客户端和服务器源代码(C语言)实现

课程设计:FTP的设计与实现 /****************client.c****************/ #include #include #include #pragma comment(lib,"ws2_32.lib") #define DEFAULT_PORT 2302 #define DEFAULT_BUFFER 2048 #define DEFAULT_MESSAGE "This is a test of the emergency \ broadcasting system" char szServerip[128], // Server to connect to szMessage[1024]; // Message to send to sever int iPort = DEFAULT_PORT; // Port on server to connect to //DWORD dwCount = DEFAULT_COUNT; // Number of times to send message BOOL bSendOnly = FALSE; // Send data only; don't receive int dirfun(); int getfun(); int putfun(); int pwdfun(); int cdfun(); int mdfun(); int delfun(); int usafun(); void usage() { printf("usage: client [-p:x] [-s:IP] [-n:x] [-o]\n\n"); printf(" -p:x Remote port to send to\n"); printf(" -s:IP Server's IP address or hostname\n"); printf(" -n:x Number of times to send message\n"); printf(" -o Send messages only; don't receive\n"); ExitProcess(1); } void ValidateArgs(int argc, char **argv) { int i; for(i = 1; i < argc; i++) { if ((argv[i][0] == '-') || (argv[i][0] == '/')) { switch (tolower(argv[i][1])) {

FTP服务器客户端源代码C语言

FTP服务器源代码: #include "Winsock.h" #include "windows.h" #include "stdio.h" #define RECV_PORT 200 #define SEND_PORT 3000 #pragma comment(lib, "wsock32.lib") SOCKET sock,sock1,sockdir,sockput,sockget; sockaddr_in ServerAddr; sockaddr_in ClientAddr; int Addrlen;//地址长度 char filename[20];//文件名 char order[10];//命令 char rbuff[1024];//接收缓冲区 char sbuff[1024];//发送缓冲区 //初始化winsock DWORD StartSock() {WSADATA WSAData; if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0) {printf("sock init fail!\n"); return (-1); } return(1); } DWORD CreateSocket() { sock=socket(AF_INET,SOCK_STREAM,0);/* 建立套接字*/ if(sock==SOCKET_ERROR) { printf("sock create fail ! \n"); WSACleanup(); return(-1); } ServerAddr.sin_family=AF_INET; ServerAddr.sin_addr.s_addr=htonl(INADDR_ANY); /* 任意网络接口*/ ServerAddr.sin_port=htons(RECV_PORT); if(bind(sock,(struct sockaddr FAR *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR) { printf("bind is the error"); return(-1);

相关文档
相关文档 最新文档