明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2522|回复: 8

请教acad宏开发的问题

[复制链接]
发表于 2008-3-17 22:01:00 | 显示全部楼层 |阅读模式

我做了一个vba宏

我现在用的是SendCommand来返回我需要的数据,我想象list命令一样,跳出一个窗口来返回我需要的数据,用什么方法?是否要调用一个txt窗口?

还有,我希望这个宏能够像line,list等cad内置的命令一样,输入一个词就能运行,该怎么设置??

我查阅了一些acad自定义命令的书,可是我看不明白,希望有大师能不吝详细赐教!

发表于 2008-3-18 12:04:00 | 显示全部楼层

将宏用public声明

写一lisp如下

(defun C:命令名 ()
  (princ)
  (command "_.VBARUN" "thisdrawing.宏名");如果你的宏名是在thisdrawing中就用这句

  (command "_.VBARUN" "模组名.宏名");如果你的宏名是在Module中就用这句
;将以上宏名、模组名用相应的名字替换即可。
)

;加载这个lisp和dvb文件,输入命令名。

 楼主| 发表于 2008-3-18 14:24:00 | 显示全部楼层

thanks a lot

不过不知道,vba怎么让command的文本窗口,像list命令一样可以弹出来并返回值?

发表于 2008-3-18 16:07:00 | 显示全部楼层
本帖最后由 作者 于 2008-3-18 16:13:27 编辑

呵呵,像lisp一样弹出返回值,也可以
不过要写代码才行,举例说明:
  1. public sub VBList()
  2. ThisDrawing.Utility.GetEntity pickobj, pickpnt, "選擇圖元對象:"
  3. nameobj = pickobj.ObjectName
  4. lty = UCase(pickobj.Linetype)
  5. lay = pickobj.Layer
  6. color = pickobj.color
  7. '當為Bylayer or Byblock線型時,找出相應的層的線型
  8. If lty = "BYLAYER" Or lty = "BYBLOCK" Then
  9.    Set layobj = ThisDrawing.Layers.Item(lay)
  10.    lty = lty & "(" & layobj.Linetype & ")"
  11. End If
  12. Select Case nameobj
  13.     Case "AcDbLine"
  14.         
  15.     Case "AcDbCircle"
  16.         get_circle pickobj, lay, lty, color, appname
  17.     Case "AcDbText", "AcDbMText"
  18.     Case "AcDbArc"
  19.     Case "AcDbBlockReference"
  20.     Case "AcDbPolyline"
  21. .......
  22.     Case Else
  23.         ThisDrawing.SendCommand "_.LIST" & vbCr & "(handent """ & pickobj.Handle & """)" & vbCr & vbCr
  24.         Exit Sub
  25. End Select
  26. errordeal:
  27. If Err.Number <> 0 Then
  28. Err.Clear
  29. Exit Sub
  30. End If
  31. end Sub
  32. Private Function get_circle(ByVal pickobj As AcadEntity, ByVal lay As String, ByVal lty As String, ByVal color As String, ByVal appname As String)
  33. Dim cenpnt As Variant, cirdia As Double
  34. cenpnt = pickobj.Center
  35. cenpnt = ThisDrawing.Utility.TranslateCoordinates(cenpnt, acWorld, acUCS, False)
  36. cirdia = pickobj.Diameter
  37. cenpnt(0) = Format(cenpnt(0), "0.0000")
  38. cenpnt(1) = Format(cenpnt(1), "0.0000")
  39. cenpnt(2) = Format(cenpnt(2), "0.0000")
  40. cirdia = Format(cirdia, "0.000")
  41. MsgBox "圖元名: Circle (圓)" & Chr(13) & Chr(13) & "圖層名: " & lay & Chr(13) & Chr(13) & "顏色號: " & color & _
  42. Chr(13) & Chr(13) & "線型名: " & lty & Chr(13) & Chr(13) & "直徑值: " & cirdia & Chr(13) & Chr(13) & _
  43. "圓心坐標點: " & "X= " & cenpnt(0) & ",Y= " & cenpnt(1) & ",Z= " & cenpnt(2) & Chr(13) & Chr(13)
  44. End Function
当然,你可以写更多function处理不同类型的图素。然后根据你所选择的图素类型再调用相应的function处理即可.
 楼主| 发表于 2008-3-20 17:46:00 | 显示全部楼层
本帖最后由 作者 于 2008-3-20 17:49:30 编辑

三楼大概没有测试你的程序,我刚学,不知道为什么当我运行的时候总会出现,编译错误,ByRef编译参数不符?

因为程序没有运行我不知道对不对,想知道你的方法是用list命令调出那个command窗口来写文字?

发表于 2008-3-20 18:57:00 | 显示全部楼层

Sub tt()
    ThisDrawing.Utility.Prompt "嗯,好的"
    SendKeys "{F2}"
End Sub

做成命令调用,下面的代码放在acad.lsp文件中载入

(vl-load-com)

(defun c:tt() (vla-runmacro (vlax-get-acad-object) "tt") (princ))

 楼主| 发表于 2008-3-20 22:13:00 | 显示全部楼层

6楼同志的方法简单,易懂,thanks!

发表于 2008-3-22 22:34:00 | 显示全部楼层
本帖最后由 作者 于 2008-3-22 22:35:22 编辑

比如我vba放在路径c:\vba.dvb

命令名为“PP”,

在命令栏中输入pp,如果vba.dvb已经加载,则运行其中的函数,比如tt()

如果没有加载,则加载vba.dvb,运行tt().

请问如何实现?

发表于 2008-3-23 11:09:00 | 显示全部楼层

(defun c:tt() (vla-runmacro (vlax-get-acad-object) "vba.dvb!tt") (princ))

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 11:31 , Processed in 0.175251 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表