请教acad宏开发的问题
<p>我做了一个vba宏</p><p>我现在用的是SendCommand来返回我需要的数据,我想象list命令一样,跳出一个窗口来返回我需要的数据,用什么方法?是否要调用一个txt窗口?</p><p>还有,我希望这个宏能够像line,list等cad内置的命令一样,输入一个词就能运行,该怎么设置??</p><p></p><p>我查阅了一些acad自定义命令的书,可是我看不明白,希望有大师能不吝详细赐教!</p><p></p> <p>将宏用public声明</p><p>写一lisp如下</p><p>(defun C:命令名 ()<br/> (princ)<br/> (command "_.VBARUN" "thisdrawing.宏名");如果你的宏名是在thisdrawing中就用这句</p><p> (command "_.VBARUN" "模组名.宏名");如果你的宏名是在Module中就用这句<br/>;将以上宏名、模组名用相应的名字替换即可。<br/>)</p><p></p><p>;加载这个lisp和dvb文件,输入命令名。</p> <p>thanks a lot</p><p>不过不知道,vba怎么让command的文本窗口,像list命令一样可以弹出来并返回值?</p> 本帖最后由 作者 于 2008-3-18 16:13:27 编辑呵呵,像lisp一样弹出返回值,也可以
不过要写代码才行,举例说明:
public sub VBList()
ThisDrawing.Utility.GetEntity pickobj, pickpnt, "選擇圖元對象:"
nameobj = pickobj.ObjectName
lty = UCase(pickobj.Linetype)
lay = pickobj.Layer
color = pickobj.color
'當為Bylayer or Byblock線型時,找出相應的層的線型
If lty = "BYLAYER" Or lty = "BYBLOCK" Then
Set layobj = ThisDrawing.Layers.Item(lay)
lty = lty & "(" & layobj.Linetype & ")"
End If
Select Case nameobj
Case "AcDbLine"
Case "AcDbCircle"
get_circle pickobj, lay, lty, color, appname
Case "AcDbText", "AcDbMText"
Case "AcDbArc"
Case "AcDbBlockReference"
Case "AcDbPolyline"
.......
Case Else
ThisDrawing.SendCommand "_.LIST" & vbCr & "(handent """ & pickobj.Handle & """)" & vbCr & vbCr
Exit Sub
End Select
errordeal:
If Err.Number <> 0 Then
Err.Clear
Exit Sub
End If
end Sub
Private Function get_circle(ByVal pickobj As AcadEntity, ByVal lay As String, ByVal lty As String, ByVal color As String, ByVal appname As String)
Dim cenpnt As Variant, cirdia As Double
cenpnt = pickobj.Center
cenpnt = ThisDrawing.Utility.TranslateCoordinates(cenpnt, acWorld, acUCS, False)
cirdia = pickobj.Diameter
cenpnt(0) = Format(cenpnt(0), "0.0000")
cenpnt(1) = Format(cenpnt(1), "0.0000")
cenpnt(2) = Format(cenpnt(2), "0.0000")
cirdia = Format(cirdia, "0.000")
MsgBox "圖元名: Circle (圓)" & Chr(13) & Chr(13) & "圖層名: " & lay & Chr(13) & Chr(13) & "顏色號: " & color & _
Chr(13) & Chr(13) & "線型名: " & lty & Chr(13) & Chr(13) & "直徑值: " & cirdia & Chr(13) & Chr(13) & _
"圓心坐標點: " & "X= " & cenpnt(0) & ",Y= " & cenpnt(1) & ",Z= " & cenpnt(2) & Chr(13) & Chr(13)
End Function
当然,你可以写更多function处理不同类型的图素。然后根据你所选择的图素类型再调用相应的function处理即可.
本帖最后由 作者 于 2008-3-20 17:49:30 编辑 <br /><br /> <p>三楼大概没有测试你的程序,我刚学,不知道为什么当我运行的时候总会出现,编译错误,ByRef编译参数不符?</p><p>因为程序没有运行我不知道对不对,想知道你的方法是用list命令调出那个command窗口来写文字?</p> <p>Sub tt()<br/> ThisDrawing.Utility.Prompt "嗯,好的"<br/> SendKeys "{F2}"<br/>End Sub</p><p>做成命令调用,下面的代码放在acad.lsp文件中载入</p><p>(vl-load-com)</p><p>(defun c:tt() (vla-runmacro (vlax-get-acad-object) "tt") (princ))</p> <p>6楼同志的方法简单,易懂,thanks!</p> 本帖最后由 作者 于 2008-3-22 22:35:22 编辑 <br /><br /> <p></p><p>比如我vba放在路径c:\vba.dvb</p><p>命令名为“PP”,</p><p>在命令栏中输入pp,如果vba.dvb已经加载,则运行其中的函数,比如tt()</p><p>如果没有加载,则加载vba.dvb,运行tt().</p><p></p><p>请问如何实现?</p> <p>(defun c:tt() (vla-runmacro (vlax-get-acad-object) "vba.dvb!tt") (princ))</p>
页:
[1]