找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 675|回复: 11

[VBA程序]:請問:如何把vba所得的selection set 傳給 lisp

[复制链接]
发表于 2003-9-9 15:55:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我寫好的 lisp 是在command line 做 input

現在希望能在 vba 做 UI

不知如何把 vb 中的 selection set

傳給 lisp (ssget)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-9-9 19:16:21 | 显示全部楼层
在VBA中,选择集的名称和句柄可以传递给VL,具体实现方法可以参考VLisp的资料。
另外的方法则是不直接传递,而通过第三者来联结,比如将值保存在XData或者XRecord,也可保存在文件或者注册表中,之后在Lisp中读出。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-9-9 23:39:34 | 显示全部楼层
"在VBA中,选择集的名称和句柄可以传递给VL"

能够详细说一下怎样做吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-9-9 23:48:03 | 显示全部楼层
句柄的传递是:(首先要引用VLAX类)
    Set sym = VLF.Item("read").funcall("handle")
    ret = VLF.Item("set").funcall(sym, SSetObj.Handle)
后面的操作就是在VL中了,不过这种方法其实是在VBA中使用VL的函数。
而选择集的名称在选择集集合中是唯一的,因而可以直接在Lisp中通过搜索表来返回选择集,具体过程可以询问熟悉Lisp的人。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-9-10 13:59:29 | 显示全部楼层
vba可以直接用 sendcommand "xxxxx".............
把選集傳給 lisp 或是 CAD原本的指令嗎?

這樣做是希望 lisp & VAB & object ARX
之間可以分割 個別獨立

arx lisp寫好的指令 完全用 command line 做input
需要vba做對話框之 UI 時 再用sendcommand
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-9-10 22:15:53 | 显示全部楼层

Re: [VBA程序]:請問:如何把vba所得的selection set 傳給 lisp

最初由 origo 发布
[B]我寫好的 lisp 是在command line 做 input

現在希望能在 vba 做 UI

不知如何把 vb 中的 selection set

傳給 lisp (ssget) [/B]


下面的代码演示中使用VBA取得选择集,使用Vlisp对这个选择集进行操作(这里测试用的是删除选择集中的物体)

首先加载下面的lisp代码:


  1. [FONT=courier new]
  2. (defun c:erasetestselection()
  3.   (vl-load-com)
  4.   (setq acadapp (vlax-get-acad-object))
  5.   (setq acaddoc (vla-get-activedocument acadapp))
  6.   (setq selectionsets (vla-get-selectionsets acaddoc))
  7.   (setq ss (vla-item selectionsets "test"))
  8.   (vla-erase ss)
  9.   (princ)
  10. )
  11. [/FONT]


然后用VBA创建这个宏:


  1. [FONT=courier new]
  2. Sub Test()
  3. Dim ss As AcadSelectionSet
  4. On Error Resume Next
  5. Set ss = ThisDrawing.SelectionSets("test")
  6. If Err Then Set ss = ThisDrawing.SelectionSets.Add("test")
  7. ss.Clear
  8. ss.SelectOnScreen
  9. ThisDrawing.SendCommand "erasetestselection" & vbCr
  10. End Sub
  11. [/FONT]


然后回到命令行,用VBARUN命令运行这个宏,
实际效果相当于删除命令。
VBA选择物体,Lisp删除物体。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-9-12 11:46:22 | 显示全部楼层
非常謝謝你的回文

(defun getVBASelection( / ss acadapp acaddoc selectionsets)
  (vl-load-com)
  (setq acadapp (vlax-get-acad-object))
  (setq acaddoc (vla-get-activedocument acadapp))
  (setq selectionsets (vla-get-selectionsets acaddoc))
  (setq ss (vla-item selectionsets "SS10"))


;如果要把 ss 變成 selection set   如同用ssget得到的東西 再去編輯
((command "move" ss "" PT1 PT2 "")
...................................

如果是這樣時 ss要如何轉換ㄋ



有沒有 其他方法

Selection Set 是不是應該會有個 table
在VBA中做的selection set是不是應該會記錄在 CAD 中
如果有的話  我在Lisp中 就應該可以直接去table中搜尋
取出來用



謝謝




還有個小問題
你用的 function 有些在help中找不到
像vla-get-activedocument
      vla-get-selectionsets
      vla-item
請問你能提供這方面的資訊嗎?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-9-12 21:37:18 | 显示全部楼层
代Quelea答一下:

1. 把SelectionSet变成SSGET得到的那种,可以用Vlisp代码转化一下,如下ss→ss2, ss2为传统的Lisp形式的选择集:
  1. [font=courier new]
  2. ...
  3. (setq ss2 (ssadd))
  4. (vlax-for obj ss
  5.   (ssadd (vlax-vla-object->ename obj) ss2)
  6. )
  7. ...
  8. [/font]


2.
Selection Set 是不是應該會有個 table
在VBA中做的selection set是不是應該會記錄在 CAD 中
如果有的話 我在Lisp中 就應該可以直接去table中搜尋
取出來用


不是这样的。

3.vla-get-activedocument,vla-get-selectionsets,vla-item这些函数,是根据命名规则得到的。它的具体的帮助在VBA帮助中,其实就是使用的VBA的ActiveX模型。
你可以参阅Vlisp的帮助文件中的这一节:
  1. [font=courier new]
  2. Visual LISP Developer's Guide
  3.     →Using the Visual LISP Environment
  4.         →Working with ActiveX
  5. [/font]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-9-15 09:33:51 | 显示全部楼层
非常謝謝  樓上回覆
詳細又清楚

不過我資質魯頓
請問


  (setq ss2 (ssadd))
  (vlax-for obj        ss
    (ssadd (vlax-vla-object->ename obj) ss2)
  )

程式中的 obj 是如何取得
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-9-15 13:59:24 | 显示全部楼层
obj不需要手动取得。

道理和foreach一样,vlax-for相当于foreach的activex 版。


(foreach ename elist
  ...
)
也不需要手动给ename一样。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-9-15 15:34:28 | 显示全部楼层
感謝
你的熱心回答
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-12-6 23:39:33 | 显示全部楼层

  1. ;;;这是lisp的选集加入到selectionSets,vla和vb就可以调用它
  2. ;;;sset为lisp的选集,NEW_SSET为vb里选集名字
  3. (defun ssfillset (ssets NEW_SSET / ssets newsset sset tmparray a)
  4.   (setq ssets (vla-get-selectionSets doc))
  5.   (if (vla-item ssets NEW_SSET)
  6.     (setq newsset (vla-item ssets NEW_SSET))
  7.     (setq newsset (vla-add ssets NEW_SSET))
  8.   )
  9.   (setq tmparray (vlax-make-safearray
  10.                     vlax-vbObject
  11.                     (cons 0 (- (sslength sset) 1))
  12.                  )
  13.   )
  14.   (setq a 0)
  15.   (repeat (sslength sset)
  16.     (vlax-safearray-put-element tmparray a
  17.       (vlax-ename->vla-object (ssname sset a))
  18.     )
  19.     (setq a (1+ a))
  20.   )
  21.   (vlax-make-variant tmparray)
  22.   (vla-addItems newsset tmparray)
  23. )

  24. ;;;反过来,vla和vb的选集用到lisp.
  25. (defun getSel (SSET_name / ss)
  26.   (setq ss (ssadd))
  27.   (vlax-for obj(vla-item (vla-get-selectionsets
  28.        (vla-get-activedocument (vlax-get-acad-object)))
  29.         SSET_name)
  30.     (ssadd (vlax-vla-object->ename obj) ss)
  31.   )
  32.   ss
  33. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 23:49 , Processed in 0.396123 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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