伯努利方程
设在右图的细管中有理想流体在做定常流动,且流动方向从左向右,我们在管的a1处和a2处用横截面截出一段流体,即a1处和a2处之间的流体,作为研究对象.设a1处的横截面积为S1,流速为V1,高度为h1;a2处的横截面积为S2,流速为V2,高度为h2.
思考下列问题:
①a1处左边的流体对研究对象的压力F1的大小及方向如何
②a2处右边的液体对研究对象的压力F2的大小及方向如何
③设经过一段时间Δt后(Δt很小),这段流体的左端S1由a1移到b1,右端S2由a2移到b2,两端移动的距离分别为ΔL1和ΔL2,则左端流入的流体体积和右端流出的液体体积各为多大 它们之间有什么关系 为什么
④求左右两端的力对所选研究对象做的功
⑤研究对象机械能是否发生变化 为什么
⑥液体在流动过程中,外力要对它做功,结合功能关系,外力所做的功与流体的机械能变化间有什么关系
推导过程:
如图所示,经过很短的时间Δt,这段流体的左端S1由a1移到b1,右端S2由a2移到b2,两端移动的距离为ΔL1和ΔL2,左端流入的流体体积为ΔV1=S1ΔL1,右端流出的体积为ΔV2=S2ΔL2.
因为理想流体是不可压缩的,所以有
ΔV1=ΔV2=ΔV
作用于左端的力F1=p1S1对流体做的功为
W1=F1ΔL1 =p1•S1ΔL1=p1ΔV
作用于右端的力F2=p2S2,它对流体做负功(因为右边对这段流体的作用力向左,而这段流体的位移向右),所做的功为
W2=-F2ΔL2=-p2S2ΔL2=-p2ΔV
两侧外力对所选研究液体所做的总功为
W=W1+W2=(p1-p2)ΔV
又因为我们研究的是理想流体的定常流动,流体的密度ρ和各点的流速V没有改变,所以研究对象(初态是a1到a2之间的流体,末态是b1到b2之间的流体)的动能和重力势能都没有改变.这样,机械能的改变就等于流出的那部分流体的机械能减去流入的那部分流体的机械能,即
E2-E1=ρ()ΔV+ρg(h2-h1)ΔV
又理想流体没有粘滞性,流体在流动中机械能不会转化为内能
∴W=E2-E1
(p1-p2)ΔV=ρ(-))ΔV+ρg(h2-h1)ΔV
整理后得:整理后得:
又a1和a2是在流体中任取的,所以上式可表述为
上述两式就是伯努利方程.
当流体水平流动时,或者高度的影响不显著时,伯努利方程可表达为
该式的含义是:在流体的流动中,压强跟流速有关,流速V大的地方压强p小,流速V小的地方压强p大
1.经常存盘
这是每一个设计人员必须牢记的一条准则,突然断电、死机等都有可能让你的作品及灵感消失得无影无踪。在AutoCAD中,我们也可以让CAD自动存盘:点击“工具→选项”,出现“选项”对话框,进入“文件”选项卡,设置“自动保存路径”,然后在“打开和保存”选项卡里设置“自动保存”及保存时间间隔。注意:不要把时间间隔设得太短,那样会浪费系统资源,一般设5分钟就可以了。
2.多看提示
AutoCAD软件是一套比较人性化的软件,每一步操作都会有提示指导。就算某个命令你原来从未使用过,只要根据提示一步一步做下去,也能完成。AutoCAD软件的提示行区域高度,一般要两到三行,这样就能完全看到每一步的提示。多看提示的好处:可以学习从未用过的命令,学习同一命令的多种用法。
3.巧用命令
命令可以理解为快捷键。AutoCAD有很多方便我们使用的快捷方法,而且同一个命令往往又有好几种使用方式,如点击菜单、点击工具图标、输入键盘命令、回车、空格键重复命令等方式。好多人都觉得用工具图标比较快,其实用键盘输入命令是最快的。我们一定要记住常用的命令。如直线“L”、多段线“PL”、复制“CO、CP”、删除“E”、移动“M”、列表“LIST”、镜像“MI”等。掌握键盘命令有一个简便方法,那就是在点击菜单或图标时,命令行都会出现该命令的键盘命令全称,我们可以试着输入命令全称的前一至两个字母,一般那就是该命令的缩写。
4.良好习惯
养成良好的作图习惯,作品的可移植性和可读性会大大提高。笔者指的良好习惯有:
①能用多段线(PLINE)作图就不要用直线(LINE),因为多段线是一个物件,在以后选择或二次加工时会很方便。
②用好图层(LAYER)功能,把不同类型的物件分配到不同的图层中,以便以后分类加工。
③灵活运用分组(GROUP)及块定义(BLOCK)功能,力求把同一组物件一次性选中,以防编辑时漏掉其中某一部分。
④常用的作图界限、尺寸、标注样式、文字样式等要做好模板,以便快速调用。
⑤不要轻易打散(EXPLODE)系统生成的填充样式、标注等,这对你以后编辑有帮助。
⑥尽量不要使用系统默认字体以外的字体,以防传输至其他电脑里时产生乱码。
⑦模型空间只用来作图,图纸空间只用来放置图框。
5.精确作图
四然在其他作图软件(如Photoshop、3DSMAX等)里,精确作图也是一个重要的规范,但是这一条在AutoCAD中尤其重要。CAD里面所有的物体,系统都会严格按作图者给定的尺寸绘制,即使你的尺寸是随便给出的。有些朋友在作图时忽视尺寸,标注时尺寸就不正确,然后再把标注打散后改正,这是要严格禁止的,因为这时的图已经没有实际尺寸的比例了,也不会再根据你的编辑改动而实时自动改正了。精确作图对我们以后进行标注、打印输出、图像调入调出和与他人分享都非常重要。根据笔者的经验,我们要注意以下几点:
①作图时严格按1:1比例,在最后打印输出时再调整比例。
②灵活运用点捕捉功能,不要以为自己眼力过人,随便一点就能点中直线的端点,那是不可能的。
③该闭合的线一定要用命令闭合(CLOSE)。
④对于已知的长度,我们可以用键盘直接输入。
⑤灵活运用正交模式、栅格与捕捉。
6.用“心”作图
这一条是献给所有奋战在设计岗位上的朋友们的,只有用心作图,我们才能作出正确、合乎规范、漂亮的图纸,我们的劳动成果才会更容易被认可,效率才能得到真正提高。
使用AutoCAD软件其实不难,只要记住笔者上面的“二十四字秘诀”,在实践中经常练习,你的CAD水平一定会在短时间内提高一个台阶。
七个命令让你成为CAD高手
一、绘制基本图形对象
1、几个基本常用的命令
1.1、鼠标操作
通常情况下左键代表选择功能,右键代表确定“回车”功能。如果是3D鼠标,则滚动键起缩放作用。拖拽操作是按住鼠标左键不放拖动鼠标。但是在窗口选择时从左往右拖拽和从右往左拖拽有所不同。
窗选:左图从左往右拖拽选中实线框内的物体,只选中了左边的柱子。
框选:右图从右往左拖拽选中虚线框内的物体和交叉的物体,选中了右边的柱子和梁。
1.2、Esc取消操作:当正在执行命令的过程中,敲击Esc键可以中止命令的操作。
1.3、撤销放弃操作:autocad支持无限次撤销操作,单击撤销按钮 或输入u,回车。
1.4、AutoCAD中,空格键和鼠标右键等同回车键,都是确认命令,经常用到。
1.5、经常查看命令区域的提示,按提示操作。
2、绘制图形的几个操作
这是cad的绘图工具条,在使用三维算量往往不需要使用,因此已把该工具条隐藏。为了了解cad概念,以下介绍几个基本的命令。
2.1绘制直线:单击工具条直线命令或在命令行中输入L,回车。在绘图区单击一点或直接输入坐标点,回车,接着指定下一点,回车,重复下一点,或回车结束操作。或者输入C闭合。
举例:绘制一个三角形的三个边:
命令行输入:L 回车 指定第一个点:
单击一点:回车。重复单击另一点,回车。
输入:C回车。直线闭合,形成一个三角形。
2.2绘制多段线:多段线是由一条或多条直线段和弧线连接而成的一种特殊的线,还可以具备不同宽度的特征。快捷键:PL。在三维算量中定义异形截面、手绘墙、梁等时常用。
举例:绘制一个异形柱截面
命令行输入:PL,回车。指定下一点,输入w(宽度),输入1,回车,修改了多段线线的宽度为1。输入快捷键F8,使用cad的正交功能,,保持直线水平,输入:500。输入:A,开始绘制圆弧,单击另一点绘制一个圆弧。输入:L,切换到绘制直线,单击一点,绘制一段直线。输入:A,绘制一个圆弧与开始点闭合为一个界面形状。
接下来就可以定义一个异形截面的柱,来选择该多段性即可。
二、图形对象的修改
由于三维算量软件对绘图功能已针对算量特点改进的很傻瓜化操作,不需要掌握太多的绘图命令,但是修改命令就使用很频繁了。常用的有:
1、 删除:符合windows操作,Del键最方便。
2、 复制:是把一个或多个对象复制到指定的位置,也可以将一个对象连续复制。
快捷键:CP。例子:复制柱子。单击 或输入CP,选择一个柱子,回车或单击鼠标右键,指定基点,利用cad的捕捉功能单击柱的中心点,右键。输入1000,回车。一个柱子复制成功。在选择完对象后,根据提示单击M,可以多重复制。
3、 移动:快捷键:M。操作与“复制”相同,与复制功能不同的是,复制是多了一个对象,移动只是改变了对象的位置。
4、 修剪:快捷键:TR。可以按指定的边界剪切不需要的部分。
单击修剪工具或输入TR,提示选择对象,选择边界对象,单击右键,提示选择对象,左键单击选择剪切后不需要的那部分,单击右键,确定。
5、 延伸:快捷键:EX。用于把延伸对象精确的延伸到目标边界上。
操作与剪切相同。这两个命令的特点是:都是先选择目标界限对象,再选择被修改的对象。
三、对象捕捉
用户在绘图时,靠鼠标和眼睛很难精确控制,利用cad的捕捉功能可以很好结合解决这个问题。对象捕捉属于透明命令,意即:在不退出其他操作的过程中,可以同时使用的命令。绘制直线等其他图形时可以使用捕捉命令。
1、 对象捕捉设置
在软件界面下方,右键单击对象捕捉,左键单击设置,弹出对话窗后可以一一进行设置需要的捕捉方式。
四、正交模式:
正交模式是绘图时常用的工具之一,快捷键:F8。可以利用绘制直线时,键入F8测试。
五、图层模式:
图层是就像一张张透明的硫酸纸,为了更好管理所有的对象,每张上面分别画着墙、柱子、梁等不同类别的对象。为了避免图形太复杂,选择错误。可以从中把不需要看到的这一张先抽出来,也就是关闭。同样也可以锁定、冻结或者设置不同的颜色等等。
快捷键:LA
六、视图缩放命令:
1、 实时平移:快捷键:P。
单击 或输入P,回车,或者按下3D鼠标的滚动键,鼠标会变成像手一样的图标,按下鼠标左键拖动,平移图形。
2 、实时缩放:利用3D鼠标的滚动键滚动可以实现实时缩放。也可以单击 ,前后移动鼠标实时缩放。
3 、窗口缩放:单击窗口缩放 ,按下鼠标左键拖动框选需要缩放的区域。
4 、缩放到上一次:单击 ,视图将恢复到上一个缩放的视图。
5 、范围缩放:单击 ,系统将所有图形全部显示在屏幕上,并最大限度充满整个屏幕。
使用VBA创建应用程序
分类:VBA教程
使用VBA创建应用程序
分类:ACAD
摘要:实例1 最简单的VBA程序—“Hello。dvb”Step 1 创建新文件运行AutoCAD 2002系统,以“acadiso。dwt”为样板创建图形文件,并调用“vbaide”命令进入VBA环境。Step 2 创建窗体(1) 选择菜单【Insert(插入)】→【UserForm(用户窗体)】,编辑器将创建一个新的窗体,并显示在窗体窗口中。
实例1 最简单的VBA程序—“Hello.dvb”
Step 1 创建新文件
运行AutoCAD 2002系统,以“acadiso.dwt”为样板创建图形文件,并调用“vbaide”命令进入VBA环境;
Step 2 创建窗体
(1) 选择菜单【Insert(插入)】→【UserForm(用户窗体)】,编辑器将创建一个新的窗体,并显示在窗体窗口中。选择该窗体,然后在属性窗口中将“Caption”项改为“Draw Text”。
(2) 在控件工具箱中单击 按钮,并在窗体的适当位置拖动鼠标,创建一个编辑框控件。
(3) 在控件工具箱中单击 按钮,并在窗体的适当位置拖动鼠标,创建一个按钮控件。选择该控件后,在属性窗口中将“Caption”项改为“Click”。
创建结果见图37-6。
Step 3 编写代码
(1) 在窗体窗口中双击按钮控件,编辑器显示代码窗口,并提示用户输入代码,如图37-7所示。代码清单如下:
Private Sub CommandButton1_Click()
Dim TextObj As AcadText '定义文字对象变量
Dim TextString As String '定义字符串变量
Dim InsPnt(0 To 2) As Double '定义文字插入点数组变量
Dim Height As Double '定义文字高度变量
TextString = TextBox1.Text '字符串取值为编辑框中输入的文字
'指定文字插入点位置和文字高度
InsPnt(0) = 100: InsPnt(1) = 100: InsPnt(2) = 0
Height = 15
'在模型空间创建文字对象
Set TextObj = ThisDrawing.ModelSpace.AddText(TextString, InsPnt, Height)
TextObj.Color = acGreen '指定文字对象的颜色为绿色
ZoomAll '缩放视图
Unload Me '关闭窗体
End Sub
(2) 单击“Standard(标准)”工具栏中的 按钮,以“Hello.dvb”为名保存该文件。 Step 4 运行VBA程序
(1) 单击“Standard(标准)”工具栏中的 按钮运行该程序,系统将切换到AutoCAD窗口,并显示如图37-8所示的对话框。用户可在该对话框的编辑框中输入“Hello, VBA!”,并单击按钮,则将在当前图形中创建文字对象,结果如图37-9所示。
实例说明
如果用户退出VBA环境并返回AutoCAD系统窗口,则需要对该程序进行加载后才能运行。加载VBA程序的方式有如下几种:
1. 选择菜单【Tools(工具)】→【Load Appcation…(加载应用程序)】,弹出“Load/Unload Applications(加载/卸载应用程序)”对话框。利用该对话框进行加载的过程与加载LISP程序相同。
2. 选择菜单【Tools(工具)】→【Macro(宏)】→【Load Project…(加载工程)】,弹出“Open VBA Project(打开VBA工程)”对话框,用户可选择“Hello.dvb”文件并单击Open按钮进行加载。
3. 选择菜单【Tools(工具)】→【Macro(宏)】→【VBA Manager…(VBA管理器)】,弹出“VBA Manager(VBA管理器)”对话框,如图37-10所示。
该对话框中的“Drawing(图形)”下拉列表中显示了加载的所有图形文件。对于该列表中指定的图形文件,“Projects(工程)”列表显示了该文件中已加载的VBA程序,用户可单击 按钮载入其他的VBA程序。小 结
本章主要介绍了AutoCAD ActiveX和VBA的概念和作用,并通过一个简单的实例讲述了在AutoCAD系统中开发VBA程序的过程。
你可以通过这个链接引用该篇文章:
http://xyz9999.bokee.com/tb.b?diaryId=13476517 合并一根直线上的两根线段
分类:VBA教程
Sub uniteline()
Dim returnobj As AcadEntity, basepnt As Variant, pnt1 As Variant, pnt2 As Variant, pnt3 As Variant, pnt4 As Variant
Dim line1 As Variant, line2 As Variant
choose1:
ActiveDocument.Utility.GetEntity returnobj, basepnt, "选择第一根线段:"
Select Case returnobj.ObjectName
Case "AcDbLine" '第一根为line
Set line1 = returnobj
pnt1 = line1.StartPoint: pnt2 = line1.EndPoint
Case "AcDbPolyline" '第一根为lwpolyline
Set line1 = returnobj
If line1.Area > 0.000001 Then '判断是否为直线
ActiveDocument.Utility.Prompt "您选择的不是一根线段,请重新选择"
GoTo choose1
Else
End If
pnt1 = basepnt
pnt2 = basepnt
basepnt = line1.Coordinates
pnt1(0) = basepnt(0): pnt1(1) = basepnt(1)
pnt2(0) = basepnt(2): pnt2(1) = basepnt(3)
If pnt1(0) = pnt2(0) Then '垂直
For i = 1 To (UBound(basepnt) + 1) / 2
If pnt1(1) > basepnt(2 * i - 1) Then pnt1(1) = basepnt(2 * i - 1)
If pnt2(1) < basepnt(2 * i - 1) Then pnt2(1) = basepnt(2 * i - 1)
Next i
Else '不垂直
For i = 1 To (UBound(basepnt) + 1) / 2
If pnt1(0) > basepnt(2 * i - 2) Then
pnt1(0) = basepnt(2 * i - 2)
pnt1(1) = basepnt(2 * i - 1)
Else
End If
If pnt2(0) < basepnt(2 * i - 2) Then
pnt2(0) = basepnt(2 * i - 2)
pnt2(1) = basepnt(2 * i - 1)
Else
End If
Next i
End If
Case Else
ActiveDocument.Utility.Prompt "您选择的不是一根线段,请重新选择"
GoTo choose1
End Select
choose2:
ActiveDocument.Utility.GetEntity returnobj, basepnt, "选择第二根线段:"
If returnobj.Handle = line1.Handle Then
ActiveDocument.Utility.Prompt "线段二与线段一重复,请重新选择"
GoTo choose2
Else
End If
Select Case returnobj.ObjectName
Case "AcDbLine" '第二根为line
Set line2 = returnobj
pnt3 = line2.StartPoint: pnt4 = line2.EndPoint
Case "AcDbPolyline" '第二根为lwpolyline
Set line2 = returnobj
If line2.Area > 0.000001 Then '判断是否为直线
ActiveDocument.Utility.Prompt "您选择的不是一根线段,请重新选择"
GoTo choose2
Else
End If
pnt3 = basepnt
pnt4 = basepnt
basepnt = line2.Coordinates
pnt3(0) = basepnt(0): pnt3(1) = basepnt(1)
pnt4(0) = basepnt(2): pnt4(1) = basepnt(3)
If pnt3(0) = pnt4(0) Then '垂直
For i = 1 To (UBound(basepnt) + 1) / 2
If pnt3(1) > basepnt(2 * i - 1) Then pnt3(1) = basepnt(2 * i - 1)
If pnt4(1) < basepnt(2 * i - 1) Then pnt4(1) = basepnt(2 * i - 1)
Next i
Else '不垂直
For i = 1 To (UBound(basepnt) + 1) / 2
If pnt3(0) > basepnt(2 * i - 2) Then
pnt3(0) = basepnt(2 * i - 2)
pnt3(1) = basepnt(2 * i - 1)
Else
End If
If pnt4(0) < basepnt(2 * i - 2) Then
pnt4(0) = basepnt(2 * i - 2)
pnt4(1) = basepnt(2 * i - 1)
Else
End If
Next i
End If
Case Else
ActiveDocument.Utility.Prompt "您选择的不是一根线段,请重新选择"
GoTo choose2
End Select
If pnt2(0) = pnt1(0) Then '垂直
If (pnt2(0) = pnt3(0)) And (pnt3(0) = pnt4(0)) Then
If pnt1(1) > pnt2(1) Then
basepnt = pnt1: pnt1 = pnt2: pnt2 = basepnt
End If
If pnt1(1) > pnt3(1) Then
basepnt = pnt1: pnt1 = pnt3: pnt3 = basepnt
End If
If pnt1(1) > pnt4(1) Then
basepnt = pnt1: pnt1 = pnt4: pnt4 = basepnt
End If
If pnt4(1) < pnt2(1) Then
basepnt = pnt4: pnt4 = pnt2: pnt2 = basepnt
End If
If pnt4(1) < pnt3(1) Then
basepnt = pnt4: pnt4 = pnt3: pnt3 = basepnt
End If
GoTo unite '合并
Else
ActiveDocument.Utility.Prompt "线段一与线段二不在同一直线上,无法合并."
End If
Else '不垂直
If pnt1(0) > pnt2(0) Then
basepnt = pnt1: pnt1 = pnt2: pnt2 = basepnt
End If
If pnt1(0) > pnt3(0) Then
basepnt = pnt1: pnt1 = pnt3: pnt3 = basepnt
End If
If pnt1(0) > pnt4(0) Then
basepnt = pnt1: pnt1 = pnt4: pnt4 = basepnt
End If
If pnt4(0) < pnt2(0) Then
basepnt = pnt4: pnt4 = pnt2: pnt2 = basepnt
End If
If pnt4(0) < pnt3(0) Then
basepnt = pnt4: pnt4 = pnt3: pnt3 = basepnt
End If
If (Abs((pnt3(1) - pnt1(1)) * (pnt2(0) - pnt1(0)) - (pnt3(0) - pnt1(0)) * (pnt2(1) - pnt1(1))) + Abs((pnt4(1) - pnt1(1)) * (pnt2(0) - pnt1(0)) - (pnt4(0) - pnt1(0)) * (pnt2(1) - pnt1(1)))) < 0.000001 Then
GoTo unite '合并
Else
ActiveDocument.Utility.Prompt "线段一与线段二不在同一直线上,无法合并."
End If
End If
End
unite:
Select Case line1.ObjectName
Case "AcDbLine"
line1.StartPoint = pnt1: line1.EndPoint = pnt4
line2.Delete
ActiveDocument.Utility.Prompt "线段一与线段二已合并."
Case "AcDbPolyline"
Do While UBound(line1.Coordinates) > 4 '新增
pnt2 = line1.Coordinates
For i = 1 To (UBound(pnt2) - 2)
ReDim basepnt(0 To (UBound(pnt2) - 2))
basepnt(i) = pnt2(i)
Next i
line1.Coordinates = basepnt
Loop '新增
ReDim basepnt(0 To 3)
basepnt(0) = pnt1(0): basepnt(1) = pnt1(1)
basepnt(2) = pnt4(0): basepnt(3) = pnt4(1)
line1.Coordinates = basepnt
line2.Delete
ActiveDocument.Utility.Prompt "线段一与线段二已合并."
Case Else
End Select
End Sub
Excel表格到CAD
分类:VBA教程
Sub Test()
On Error Resume Next
' 连接Excel应用程序
Dim xlApp As Excel.Application
Set xlApp = GetObject(, "Excel.Application")
If Err Then
MsgBox " Excel 应用程序没有运行。请启动 Excel 并重新运行程序。"
Exit Sub
End If
Dim xlSheet As Worksheet
Set xlSheet = xlApp.ActiveSheet
' 当初考虑将表格做成块的方式,可以根据需要取舍。
'Dim iPt(0 To 2) As Double
'iPt(0) = 0: iPt(1) = 0: iPt(2) = 0
Dim BlockObj As AcadBlock
Set BlockObj = ThisDrawing.Blocks("*Model_Space")
Dim iPt As Variant
iPt = ThisDrawing.Utility.GetPoint(, "指定表格的插入点: ")
If IsEmpty(iPt) Then Exit Sub
Dim xlRange As Range
Debug.Print xlSheet.UsedRange.Address
For Each xlRange In xlSheet.UsedRange
AddLine BlockObj, iPt, xlRange
AddText BlockObj, iPt, xlRange
Next
Set xlRange = Nothing
Set xlSheet = Nothing
Set xlApp = Nothing
End Sub
'边框线条粗细
Function LineWidth(ByVal xlBorder As Border) As Double
Select Case xlBorder.Weight
Case xlThin
LineWidth = 0
Case xlMedium
LineWidth = 0.35
Case xlThick
LineWidth = 0.7
Case Else
LineWidth = 0
End Select
End Function
'边框线条颜色,处理的颜色不全,请自己添加
Function LineColor(ByVal xlBorder As Border) As Integer
Select Case xlBorder.ColorIndex
Case xlAutomatic
LineColor = acByLayer
Case 3
LineColor = acRed
Case 4
LineColor = acGreen
Case 5
LineColor = acBlue
Case 6
LineColor = acYellow
Case 8
LineColor = acCyan
Case 9
LineColor = acMagenta
Case Else
LineColor = acByLayer
End Select
End Function
'给制边框
Sub AddLine(ByRef BlockObj As AcadBlock, ByVal iPt As Variant, ByVal xlRange As Range)
If xlRange.Borders(xlEdgeLeft).LineStyle = xlNone _
And xlRange.Borders(xlEdgeBottom).LineStyle = xlNone _
And xlRange.Borders(xlEdgeRight).LineStyle = xlNone _
And xlRange.Borders(xlEdgeTop).LineStyle = xlNone Then Exit Sub
Dim rl As Double
Dim rt As Double
Dim rw As Double
Dim rh As Double
rl = PToM(xlRange.Left)
rt = PToM(xlRange.top)
rw = PToM(xlRange.Width)
rh = PToM(xlRange.Height)
Dim pPt(0 To 3) As Double
Dim pLineObj As AcadLWPolyline
' 左边框的处理,仅第一列才做处理。
If xlRange.Borders(xlEdgeLeft).LineStyle <> xlNone And xlRange.Column = 1 Then
pPt(0) = iPt(0) + rl: pPt(1) = iPt(1) - rt
pPt(2) = iPt(0) + rl: pPt(3) = iPt(1) - (rt + rh)
Set pLineObj = BlockObj.AddLightWeightPolyline(pPt)
pLineObj.ConstantWidth = LineWidth(xlRange.Borders(xlEdgeLeft))
pLineObj.Color = LineColor(xlRange.Borders(xlEdgeLeft))
End If
' 下边框的处理,对于合并单元格,只处理最后一行。
If xlRange.Borders(xlEdgeBottom).LineStyle <> xlNone And (xlRange.Row = xlRange.MergeArea.Row + xlRange.MergeArea.Rows.Count - 1) Then
pPt(0) = iPt(0) + rl: pPt(1) = iPt(1) - (rt + rh)
pPt(2) = iPt(0) + rl + rw: pPt(3) = iPt(1) - (rt + rh)
Set pLineObj = BlockObj.AddLightWeightPolyline(pPt)
pLineObj.ConstantWidth = LineWidth(xlRange.Borders(xlEdgeBottom))
pLineObj.Color = LineColor(xlRange.Borders(xlEdgeBottom))
End If
' 右边框的处理,对于合并单元格,只处理最后一列。
If xlRange.Borders(xlEdgeRight).LineStyle <> xlNone And (xlRange.Column >= xlRange.MergeArea.Column + xlRange.MergeArea.Columns.Count - 1) Then
pPt(0) = iPt(0) + rl + rw: pPt(1) = iPt(1) - (rt + rh)
pPt(2) = iPt(0) + rl + rw: pPt(3) = iPt(1) - rt
Set pLineObj = BlockObj.AddLightWeightPolyline(pPt)
pLineObj.ConstantWidth = LineWidth(xlRange.Borders(xlEdgeRight))
pLineObj.Color = LineColor(xlRange.Borders(xlEdgeRight))
End If
' 上边框的处理,仅第一行才做处理。
If xlRange.Borders(xlEdgeTop).LineStyle <> xlNone And xlRange.Row = 1 Then
pPt(0) = iPt(0) + rl + rw: pPt(1) = iPt(1) - rt
pPt(2) = iPt(0) + rl: pPt(3) = iPt(1) - rt
Set pLineObj = BlockObj.AddLightWeightPolyline(pPt)
pLineObj.ConstantWidth = LineWidth(xlRange.Borders(xlEdgeTop))
pLineObj.Color = LineColor(xlRange.Borders(xlEdgeTop))
End If
Set pLineObj = Nothing
End Sub
'给制文本
Sub AddText(ByRef BlockObj As AcadBlock, ByVal InsertionPoint As Variant, ByVal xlRange As Range)
If xlRange.Text = "" Then Exit Sub
Dim rl As Double
Dim rt As Double
Dim rw As Double
Dim rh As Double
rl = PToM(xlRange.Left)
rt = PToM(xlRange.top)
rw = PToM(xlRange.MergeArea.Width)
rh = PToM(xlRange.MergeArea.Height)
Dim i As Integer
Dim s As String
For i = 1 To Len(xlRange.Text) '将EXCEL的换行符替换成P,注如果是在R2002以上可使用Replace函数。
If Asc(Mid(xlRange.Text, i, 1)) = 10 Then
s = s & "P"
Else
s = s & Mid(xlRange.Text, i, 1)
End If
Next
Dim iPt(0 To 2) As Double
iPt(0) = InsertionPoint(0) + rl: iPt(1) = InsertionPoint(1) - rt: iPt(2) = 0
Dim mTextObj As AcadMText
Set mTextObj = BlockObj.AddMText(iPt, rw, s) '"{f" & xlRange.Font.Name & ";" & s & "}")
mTextObj.LineSpacingFactor = 0.75
mTextObj.Height = PToM(xlRange.Font.Size)
' 处理文字的对齐方式
Dim tPt As Variant
If xlRange.VerticalAlignment = xlTop And (xlRange.HorizontalAlignment = xlLeft Or xlRange.HorizontalAlignment = xlGeneral) Then
mTextObj.AttachmentPoint = acAttachmentPointTopLeft
tPt = iPt
ElseIf xlRange.VerticalAlignment = xlTop And xlRange.HorizontalAlignment = xlCenter Then
mTextObj.AttachmentPoint = acAttachmentPointTopCenter
tPt = ThisDrawing.Utility.PolarPoint(iPt, 0, rw / 2)
ElseIf xlRange.VerticalAlignment = xlTop And xlRange.HorizontalAlignment = xlRight Then
mTextObj.AttachmentPoint = acAttachmentPointTopRight
tPt = ThisDrawing.Utility.PolarPoint(iPt, 0, rw)
ElseIf xlRange.VerticalAlignment = xlCenter And (xlRange.HorizontalAlignment = xlLeft _
Or xlRange.HorizontalAlignment = xlGeneral) Then
mTextObj.AttachmentPoint = acAttachmentPointMiddleLeft
tPt = ThisDrawing.Utility.PolarPoint(iPt, -1.5707963, rh / 2)
ElseIf xlRange.VerticalAlignment = xlCenter And xlRange.HorizontalAlignment = xlCenter Then
mTextObj.AttachmentPoint = acAttachmentPointMiddleCenter
tPt = ThisDrawing.Utility.PolarPoint(iPt, -1.5707963, rh / 2)
tPt = ThisDrawing.Utility.PolarPoint(tPt, 0, rw / 2)
ElseIf xlRange.VerticalAlignment = xlCenter And xlRange.HorizontalAlignment = xlRight Then
mTextObj.AttachmentPoint = acAttachmentPointMiddleRight
tPt = ThisDrawing.Utility.PolarPoint(iPt, -1.5707963, rh / 2)
tPt = ThisDrawing.Utility.PolarPoint(tPt, 0, rw / 2)
ElseIf xlRange.VerticalAlignment = xlBottom And (xlRange.HorizontalAlignment = xlLeft _
Or xlRange.HorizontalAlignment = xlGeneral) Then
mTextObj.AttachmentPoint = acAttachmentPointBottomLeft
tPt = ThisDrawing.Utility.PolarPoint(iPt, -1.5707963, rh)
ElseIf xlRange.VerticalAlignment = xlBottom And xlRange.HorizontalAlignment = xlCenter Then
mTextObj.AttachmentPoint = acAttachmentPointBottomCenter
tPt = ThisDrawing.Utility.PolarPoint(iPt, -1.5707963, rh)
tPt = ThisDrawing.Utility.PolarPoint(tPt, 0, rw / 2)
ElseIf xlRange.VerticalAlignment = xlBottom And xlRange.HorizontalAlignment = xlRight Then
mTextObj.AttachmentPoint = acAttachmentPointBottomRight
tPt = ThisDrawing.Utility.PolarPoint(iPt, -1.5707963, rh)
tPt = ThisDrawing.Utility.PolarPoint(tPt, 0, rw)
End If
mTextObj.InsertionPoint = tPt
Set mTextObj = Nothing
End Sub
' 磅换算成毫米
' 注:意义不大,转换的尺寸有偏差,最好自己设定一个转换规则。
Function PToM(ByVal Points As Double) As Double
PToM = Points * 0.3527778
End Function
2007.5.19 09:39 作者:CAD 收藏 | 评论:0
把当前图纸中符合条件的圆替换为块
分类:VBA教程
把当前图纸中符合条件的圆替换为块(注:块在当前图纸中已存在)
Public Sub ChangeEntity(ByVal MinRadius As Double, ByVal MaxRadius As Double, _
ByVal BlockName As Variant, ByVal AutoSelect As Boolean)
On Error Resume Next
Dim ssobject As AcadCircle
Dim InsertionPoint(0 To 2) As Double
Dim NewBlock As AcadBlockReference
'创建选择集
Dim ssetObj As AcadSelectionSet
Set ssetObj = AcadDoc.SelectionSets("BlockCount")
If Err.Number <> 0 Then
Err.Clear
Set ssetObj = AcadDoc.SelectionSets.Add("BlockCount")
End If
'清空选择集
ssetObj.Clear
'创建过滤机制
Dim fType(0 To 6) As Integer
Dim fData(0 To 6) As Variant
fType(0) = 0: fData(0) = "Circle"
fType(1) = -4: fData(1) = "<AND"
fType(2) = -4: fData(2) = ">="
fType(3) = 40: fData(3) = MinRadius
fType(4) = -4: fData(4) = "<="
fType(5) = 40: fData(5) = MaxRadius
fType(6) = -4: fData(6) = "AND>"
'选择符合条件的所有图元-圆
If AutoSelect Then
'自动选择方式
ssetObj.Select acSelectionSetAll, , , fType, fData
Else
'提示用户选择
ssetObj.SelectOnScreen fType, fData
End If
If ssetObj.Count = 0 Then Exit Sub
'替换每一个圆为指定的块对象
For Each ssobject In ssetObj
InsertionPoint(0) = ssobject.Center(0)
InsertionPoint(1) = ssobject.Center(1)
InsertionPoint(2) = ssobject.Center(2)
On Error GoTo ErrHandle
Set NewBlock = AcadDoc.ModelSpace.InsertBlock(InsertionPoint, BlockName, 1, 1, 1, 0)
ssobject.Delete
Set NewBlock = Nothing
Next
'删除数组
Erase fType: Erase fData
'刷新视图
'AcadDoc.Regen acActiveViewport
MsgBox "当前图纸中有 " & ssetObj.Count & " 个符合条件的圆被替换为块 “" & BlockName & "”。", vbInformation, "提示:"
'删除选择集
ssetObj.Clear
ssetObj.Delete
Set ssetObj = Nothing
Exit Sub
ErrHandle:
Select Case Err.Number
Case -2147418113
MsgBox "在当前图纸中找不到名称为: “" & BlockName & "” 的块参照,请确认块名!", vbCritical, "错误:"
Case Else
MsgBox Err.Number & Chr(13) & Err.Description, vbCritical, "产生了以下错误:"
End Select
Err.Clear
End Sub
2007.5.19 09:37 作者:CAD 收藏 | 评论:0
AutoCAD中图块使用必须注意的几个问题
分类:CAD应用
熟练掌握图块特性和使用图块绘图,是每一个渴望成为AutoCAD高手必备的利器。虽然组成图块的各对象都有自己的图层、颜色、线型和线宽等特性,但插入到图形中,图块各对象原有的图层、颜色、线型和线宽特性常常会发生变化。一般AutoCAD书刊中只涉及图块的定义、插入和存盘等内容,而关于图块插入前后其组成对象一般特性发生变化的内容则很少见到。总结它们的变化规律,对于正确使用图块,提高计算机绘图与设计的效率很有意义。本文讨论的图块组成对象的一般特性仅限于图块组成对象的图层、颜色、线型和线宽。
讨论图块组成对象图层、颜色、线型和线宽的变化,涉及到的图层特性包括图层设置和图层状态。图层设置是指在图层特性管理器中对图层的颜色、图层的线型和图层的线宽的设置。图层状态是指图层的打开与关闭状态、图层的解冻与冻结状态、图层的解锁与锁定状态和图层的可打印与不可打印状态等。
一、图块组成对象图层的继承性
在图块插入时,图块中0层上的对象改变到图块的插入层,图块中非0层上的对象图层不变。即图块中原非0层上的对象,如在被插入图形文件中有与其同名的图层,则分别置于各自的同名图层,被插入图形文件中图层的设置不变。如在被插入图形文件中没有与其同名的图层,则AutoCAD首先在被插入图形文件中新建图块的同名图层,并继承图块中非0层对象所在图层的设置,然后把图块中非0层上的对象分别置于各自的同名图层。总之,若0层不是插入层,则图块中0层上的对象,其图层发生改变,被重新置于图块的插入层;图块中非0层上的对象,其图层保持不变,因此我们说非0层对象的图层具有继承性。若0层就是插入层,则图块中各对象所在的图层保持不变。
图块插入后,如果关闭图块的插入层,会使图块中与插入层同名层上的对象不可见,如果0层不是插入层,也会使图块中0层上的对象不可见。因为,图块中0层上的对象已重新置于图块的插入层,但图块中其他图层(既非插入层也非0层)上的对象仍然可见。但是要注意,如果冻结图块的插入层,不管图块中的各个对象位于哪一层,整个图块都将不可见,不但图块中与插入层同名层上的对象和图块中0层上的对象不可见,图块中非插入层上的对象也不可见。如果0层为非插入层,关闭或冻结0层,对图块中原0层对象的可见性没有影响。如果关闭或冻结的图层既非图块的插入层也非0层,会使图块中该层上的对象不可见。
图块插入后,还可以随时改变图块的插入层,先选择图块,在“对象特性”工具栏上单击“图层状态”下拉列表框中的下拉按扭,再单击所需要的图层即可。如上所述,如果冻结图块的插入层。则在该层插入的整个图块将不可见,可以通过这个方法来验证某个图层是否为图块的插入层。
如果图块的插入层既不是0层也不是图块中各对象所在的图层,那么当删除了该层上的所有对象(包括所插入的图块)后,就能够删除该层。但是,图块中各对象所在的图层,不管是不是图块的插入层,即使图层中已经没有任何对象,也不能删除。
如果图块插入后被分解(Explode),则图块插入前位于0层、图块插入后改变到图块插入层的对象,将再从图块的插入层回归到0层。总之,图块分解后,图块中不同图层的对象所在的图层将“各归各位”,恢复到图块插入前各对象所在的图层。
二、图块组成对象颜色、线型和线宽的继承性
为了讨论方便,先约定几个术语。
Bylayer设置就是在绘图时把当前颜色、当前线型或当前线宽设置为Bylayer。如果当前颜色(当前线型或当前线宽)使用Bylayer设置,则所绘对象的颜色(线型或线宽)与所在图层的图层颜色(图层线型或图层线宽)一致,所以Bylayer设置也称为随层设置。
Byblock设置就是在绘图时把当前颜色、当前线型或当前线宽设置为Byblock。如果当前颜色使用Byblock设置,则所绘对象的颜色为白色(White);如果当前线型使用Byblock设置,则所绘对象的线型为实线(Continuous);如果当前线宽使用Byblock设置,则所绘对象的线宽为默认线宽(Default),一般默认线宽为0.25mm,默认线宽也可以重新设置,Byblock设置也称为随块设置。
显式设置就是在绘图时把当前颜色、当前线型或当前线宽设置为显式,既非Bylayer,也非Byblock。
Bylayer块是指颜色、线型和线宽都采用Bylayer设置绘制的图块;Byblock块是指颜色、线型和线宽都采用Byblock设置绘制的图块;Non-by块是指颜色、线型和线宽都采用显式设置绘制的图块。
在Bylayer块插入后,图块中各对象的颜色、线型和线宽与图块插入后各对象所在图层的设置,即图层颜色、图层线型和图层线宽一致,而不是与图块插入后各对象所在图层的当前设置,即当前颜色、当前线型和当前线宽一致。也就是说,在Bylayer块插入前,如果在被插图形文件中有图块的同名层,则 Bylayer块插入后,图块相应图层上对象的颜色、线型和线宽将跟随被插图形文件中图块的同名层的图层设置。这时,如果图块图层的设置与被插入图形文件图块同名层的设置不同,则在图块插入前后,图块颜色、线型和线宽有明显变化。如果在被插入图形文件中没有图块的同名层,则Bylayer块插入后,图块相应图层上对象的颜色、线型和线宽将保持不变。Bylayer块分解前后,图块所有对象的颜色、线型和线宽将保持不变。Bylayer块插入后,图块组成对象的颜色、线型和线宽三者有条件的变化。
在Byblock块插入后,图块中所有对象的颜色、线形与线宽都与插入层的当前设置(当前颜色、线型和线宽) 一致。虽然在图块插入后图块中的各个对象一般不会在同一个图层上,但是图块中所有对象却具有相同的颜色、相同的线型和相同的线宽。Byblock块分解后,图块所有对象的颜色变成Byblock色(白色),所有对象的线型变成Byblock型(实线),但是所有对象的线宽仍保留图块插入时的线宽。Byblock块插入后,图块组成对象的颜色、线型和线宽三者无条件的变化。
在Non-by块插入后,图块中所有对象的颜色、线形与线宽都保持不变。Non-by分解前、后图块所有对象的颜色、线型和线宽将保持不变。Non-by块图块插入后,图块组成对象的颜色、线型和线宽三者没有变化。
如果绘制图块中某个对象时,其颜色、线型或线宽采用的不是同一种设置,则若颜色、线型或线宽采用Bylayer设置,则图块插入后,该对象对应的颜色、线型或线宽将与该对象所在图层的颜色、线型或线宽一致。若颜色、线型或线宽采用Byblock设置,则图块插入后,该对象对应的颜色、线型或线宽将与插入层的当前颜色、当前线型或当前线宽一致。若颜色、线型或线宽采用Non-by设置,则图块插入后,该对象对应的颜色、线型或线宽将保持该对象绘制时颜色、线型或线宽不变。
在图块插入后,如果对图块的颜色、线型或线宽不满意,当然可以把图块分解后再进行调整,但如果不分解图块而直接调整图块的颜色、线型或线宽,则Bylayer块、Byblock块、Non-by块需要区别对待。
在Bylayer块插入后,图块中各对象的颜色、线型与线宽,不可以通过“对象特性”工具栏上“颜色”下拉列表框、“线型”下拉列表框以及“线宽”下拉列表框来直接改变,但可以通过在“图层特性管理器”中改变图层的颜色、线型或线宽来间接改变。单击“对象特性”工具栏上“图层”按扭,可以打开“图层特性管理器”窗口。
在Byblock块插入后,图块中各对象的颜色、线型与线宽,可以通过“对象特性”工具栏上“颜色”下拉列表框、“线型”下拉列表框以及“线宽”下拉列表框来直接改变。
在Non-by块插入后,图块如不分解,图块中各对象的颜色、线型与线宽绝对不可能改变,无论是通过“对象特性”工具栏上“颜色”下拉列表框、“线型”下拉列表框和“线宽”下拉列表框直接改变,还是在“图层特性管理器”中通过改变图层的颜色、线型或线宽间接改变。
如果绘制图块中某个对象时,其颜色、线型或线宽采用的不是同一种设置,则若颜色、线型或线宽采用Bylayer设置,图块插入后,该对象对应的颜色、线型或线宽可以间接改变;若颜色、线型或线宽采用Byblock设置,则图块插入后,该对象对应的的颜色、线型或线宽可以直接改变;若颜色、线型或线宽采用Non-by设置,则图块插入后,该对象对应的颜色、线型或线宽将不能再改变。
三、图块绘制时的几点建议
根据以上对图块组成对象的图层、颜色、线型和线宽的变化分析,得出如下结论。
要使在图块插入后图块各对象的图层随图块的插入层、图块各对象的颜色、线型与线宽都随图块插入层的图层设置,就在0层上用Bylayer颜色、Bylayer线型和Bylayer线宽制块,即0层上的Bylaye块插入后,其图块各对象所在的图层将变换为图块的插入层,其图块各对象的颜色、线型与线宽将与图块插入层的图层设置一致。
要使图块插入后图块各对象的图层随图块的插入层、图块各对象的颜色、线型与线宽都随图块插入层的当前设置,就在0层上用Byblock颜色、Byblock线型和Byblock线宽制块,即0层上Byblock块插入后,其图块各对象所在的图层将改变为图块的插入层,其图块各对象的颜色、线型与线宽将与图块插入层的当前设置一致。
要使图块插入后图块各对象的图层、颜色、线型与线宽都不变,就在非0层上用显式颜色、显式线型和显式线宽制块。
为了更好地组织和管理图形,一般一个图层使用一种颜色,因此希望图库中图块所有对象都能定位到图块的插入层,图块所有对象的颜色都能随该层的图层颜色或当前颜色,而图块所有对象的线型与线宽不变,那么,应在0层上用Bylayer颜色或Byblock颜色、用显式线型和用显式线宽来绘制图块。
标注上下标的方法
分类:CAD应用
1)上标:编辑文字时,输入2^,然后选中2^,点a/b按键,即可。
(2)下标:编辑文字时,输入^2,然后选中^2,点a/b按键,即可。
(3)上下标:编辑文字时,输入2^2,然后选中2^2,点a/b按键,即可。
关于CAD字体的设置技巧
分类:CAD应用
关于CAD字体的设置技巧
分类:ACAD
在转化ACAD图纸的过程中,经常出现字体不匹配,出现乱码等问题,现将部分问题的解决方法分享。
1.ACAD的低版本文件,如R13(及R13以下)的DWG文件,用R14(及R14以上)版本打开时,即使正确地选择了汉字字形文件,还是会出现汉字乱码,原因是R14(及R14以上)与R13(及R13以下)采用的代码页不同。解决办法:可到AutoDesk公司主页下载代码页转换工具wnewcp工具进行转换,如原图为简体中文,选择转换为GB2312或ANSI936均可。
2.在一个块里写字,如在标题栏里写字,一些内容太长造成文字出界,在acad2000以前的版本里无法调整块里面的文字属性(即无法调整块中块),只能采用炸开的办法再调整文字属性。解决办法:升级到acad2002,它的块里面可以更改下一层块的属性。
3.当数字与文字混合输入时,高度不一,通常来说数字比文字的高度大一点。解决办法:我通常数字用用style指令指定数字用GBENOR字体(ACAD自带,字高比其它字体矮),文字用HZTXT字体(如没有HZTXT字体,可根据感觉另选字体代替)。
4.打开其他公司的CAD图纸,提示无图纸中的某字体,但用其他字体替代后,出现乱码。解决办法:新建一文档,将该CAD图纸作为一个块插入,乱码将会消失(但字体会与原图有出入,若需100%准确,则需要对方通过匹配的字体)。