乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 129|回复: 8

请教acad宏开发的问题

[复制链接]

1

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
8
发表于 2008-3-17 22:01:00 | 显示全部楼层 |阅读模式
我做了一个vba宏
我现在用的是SendCommand来返回我需要的数据,我想象list命令一样,跳出一个窗口来返回我需要的数据,用什么方法?是否要调用一个txt窗口?
还有,我希望这个宏能够像line,list等cad内置的命令一样,输入一个词就能运行,该怎么设置??
我查阅了一些acad自定义命令的书,可是我看不明白,希望有大师能不吝详细赐教!
回复

使用道具 举报

11

主题

49

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
93
发表于 2008-3-18 12:04:00 | 显示全部楼层
将宏用public声明
写一lisp如下
(defun C:命令名 ()
  (princ)
  (command "_.VBARUN" "thisdrawing.宏名");如果你的宏名是在thisdrawing中就用这句
  (command "_.VBARUN" "模组名.宏名");如果你的宏名是在Module中就用这句
;将以上宏名、模组名用相应的名字替换即可。
)
;加载这个lisp和dvb文件,输入命令名。
回复

使用道具 举报

1

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
8
发表于 2008-3-18 14:24:00 | 显示全部楼层
thanks a lot
不过不知道,vba怎么让command的文本窗口,像list命令一样可以弹出来并返回值?
回复

使用道具 举报

11

主题

49

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
93
发表于 2008-3-18 16:07:00 | 显示全部楼层

呵呵,像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 IfSelect Case nameobj
  12.     Case "AcDbLine"
  13.         
  14.     Case "AcDbCircle"
  15.         get_circle pickobj, lay, lty, color, appname
  16.     Case "AcDbText", "AcDbMText"
  17.     Case "AcDbArc"
  18.     Case "AcDbBlockReference"
  19.     Case "AcDbPolyline"
  20. .......
  21.     Case Else
  22.         ThisDrawing.SendCommand "_.LIST" & vbCr & "(handent """ & pickobj.Handle & """)" & vbCr & vbCr
  23.         Exit Sub
  24. End Select
  25. errordeal:
  26. If Err.Number  0 Then
  27. Err.Clear
  28. Exit Sub
  29. End If
  30. end Sub
  31. Private Function get_circle(ByVal pickobj As AcadEntity, ByVal lay As String, ByVal lty As String, ByVal color As String, ByVal appname As String)
  32. Dim cenpnt As Variant, cirdia As Double
  33. cenpnt = pickobj.Center
  34. cenpnt = ThisDrawing.Utility.TranslateCoordinates(cenpnt, acWorld, acUCS, False)
  35. cirdia = pickobj.Diameter
  36. cenpnt(0) = Format(cenpnt(0), "0.0000")
  37. cenpnt(1) = Format(cenpnt(1), "0.0000")
  38. cenpnt(2) = Format(cenpnt(2), "0.0000")
  39. cirdia = Format(cirdia, "0.000")
  40. MsgBox "圖元名: Circle (圓)" & Chr(13) & Chr(13) & "圖層名: " & lay & Chr(13) & Chr(13) & "顏色號: " & color & _
  41. Chr(13) & Chr(13) & "線型名: " & lty & Chr(13) & Chr(13) & "直徑值: " & cirdia & Chr(13) & Chr(13) & _
  42. "圓心坐標點: " & "X= " & cenpnt(0) & ",Y= " & cenpnt(1) & ",Z= " & cenpnt(2) & Chr(13) & Chr(13)
  43. End Function
当然,你可以写更多function处理不同类型的图素。然后根据你所选择的图素类型再调用相应的function处理即可.
回复

使用道具 举报

1

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
8
发表于 2008-3-20 17:46:00 | 显示全部楼层

三楼大概没有测试你的程序,我刚学,不知道为什么当我运行的时候总会出现,编译错误,ByRef编译参数不符?
因为程序没有运行我不知道对不对,想知道你的方法是用list命令调出那个command窗口来写文字?
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 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))
回复

使用道具 举报

1

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
8
发表于 2008-3-20 22:13:00 | 显示全部楼层
6楼同志的方法简单,易懂,thanks!
回复

使用道具 举报

20

主题

105

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
185
发表于 2008-3-22 22:34:00 | 显示全部楼层

比如我vba放在路径c:\vba.dvb
命令名为“PP”,
在命令栏中输入pp,如果vba.dvb已经加载,则运行其中的函数,比如tt()
如果没有加载,则加载vba.dvb,运行tt().
请问如何实现?
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2008-3-23 11:09:00 | 显示全部楼层
(defun c:tt() (vla-runmacro (vlax-get-acad-object) "vba.dvb!tt") (princ))
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-5 03:46 , Processed in 0.549603 second(s), 71 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表