找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 987|回复: 12

[求助] [求助]:在a图形执行的如何能跨图形得到结果!!

[复制链接]
发表于 2004-9-7 14:06:30 | 显示全部楼层 |阅读模式

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

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

×
比如在a图形中执行一个lisp求得一个点串列,如何将这个点串列在图形b中绘出.
使用vla-activate可激活图形,但好像并不支援跨图形的执行.
因初学不知此问题困难度,如果太过简单,还请见谅.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-9-7 15:19:50 | 显示全部楼层
;;You can use vl-propagate to pass the point list to drawing B,
;;then activate drawing B, run routine. Or stay in Drawing A control
;;drawing B as follow example.
(DEFUN C:TEST(/ docs P1 P2 DocB MspaceB)
  (setq docs (vla-get-documents (vlax-get-acad-object)))
  (SETQ P1 (VLAX-3D-POINT '(0 0 0))
        P2 (VLAX-3D-POINT '(100 100 0)))
  (setq DocB (vla-ITEM docs "DrawingB.dwg"))
  (SETQ MspaceB (vla-get-modelspace DocB))
  (vla-addline MspaceB p1 p2)
  (PRINC)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-9-8 15:08:58 | 显示全部楼层
不好意思,再请教一个问题
看您的程序,图形b并没有被激活
所以算是由图形a启动lisp,将line加入图形b
如果我想要在图形b中取得一个point,要如何做呢??
我在您的程序(vla-addline mspaceb p1 p2)下加入以下程序码
(vla-activate docb)
(setq utility (vla-get-utility docb))
(setq q (vla-getpoint utility nil "输入一个点:"))
执行后cad就停在图形b,当手动激活图形a,cad才要求我输入一个点,请问我要如何做才可以在图形b中取得一个点呢??
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-8 19:01:49 | 显示全部楼层
你的程序所有语句都在图档A内运行,包括你给出的三句,试问又怎么可能在图档B让你输入点呢?我想你最多能用VLA-SENDCOMMAND向图档B发送几个简单命令,而这种getXXX的交互命令ViualLisp可能解决不了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-9-9 09:08:31 | 显示全部楼层
先感谢aidraft的指教:
以下附一个autocad vba的sub
Sub example_activatemethod()
Dim newdrawing1 As AcadDocument
Dim newdrawing2 As AcadDocument
Dim ret_val As Variant
Set newdrawing1 = ThisDrawing.Application.Documents.Add("")
Set newdrawing2 = ThisDrawing.Application.Documents.Add("")
Dim drawing As AcadDocument
For Each drawing In ThisDrawing.Application.Documents
drawing.Activate
MsgBox "图形" & drawing.Name & "为当前作用中." & vbCrLf
ret_val = ThisDrawing.Utility.GetPoint(, "请输入一个点:")
Next drawing
End Sub
;-------------------------------------------------------------------
(defun c:example_activeate ()
(setq index 0)
(setq acadobject (vlax-get-acad-object)
acaddocument (vla-get-activedocument acadobject)
mspace (vla-get-modelspace acaddocument)
)
(setq docsets (vla-get-documents acadobject))
(setq newdrawing1 (vla-add docsets "")
newdrawing2 (vla-add docsets "")
)
(repeat (vla-get-count docsets)
(setq obj (vla-item docsets index))
(vla-activate obj)
(setq name (vla-get-name obj))
(alert (strcat "图形" name "为当前作用中." "\n"))
(setq index (+ index 1))
) ; _ end of repeat
) ; _ end of defun example_activeate
;-------------------------------------------------------------------
以上从autocad vba书上抄来的sub,它不仅可以顺利激活任意图形并可在任意图形中执行GetPoint方法将值传回变量ret_val,但lisp只要一激活执行lisp以外的图形,程序就挂在哪里.
我想说是否vba为独立于autocad图形外的程序,只是执行时不停转换激活的图形,但vlisp是依附在某一图形下的程序,只要一转换激活的图形,程序就挂在哪里.
如果以上所说为真,那autodesk真是对不起广大的lisp支持者.我也真倒楣才刚开始学vlisp,问题就一大堆.
废话不多说了,希望各位先进能将defun c:example_activeate帮忙看一下,如何修改方可达到与Sub example_activatemethod()相同的功能.
还是说vlisp真的无法做到,希望各位先进能多帮帮忙.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-9-9 23:02:09 | 显示全部楼层
要在里面用GetPoint恐怕不行.

多图档就相当于几个国家,lisp是国家的内部事务,你虽然可以通过外交手段,得到一些国外的事物,但不能在别的国家里动刀动抢.
vb和c++等就不一样(联合国^_^)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-10 07:40:43 | 显示全部楼层
最初由 aeo 发布
[B]要在里面用GetPoint恐怕不行.

多图档就相当于几个国家,lisp是国家的内部事务,你虽然可以通过外交手段,得到一些国外的事物,但不能在别的国家里动刀动抢.
vb和c++等就不一样(联合国^_^) [/B]


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

使用道具 举报

 楼主| 发表于 2004-9-13 08:42:57 | 显示全部楼层
既然vlisp好像做不到,那请教各位先进,如何使变量能在vlisp及vba间传递(字串符,整数,实数)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-13 09:32:57 | 显示全部楼层
RAW MATERIALS.....

Hello Turbosketch,


I have successfully used following three methods:

1) If you want to store a single integer / string / real, you can store it in appropriate 'user' type system variable. (useri1-5, users1-5, userr1-5). The values can be stored manually in the drawing or through lisp or VBA. They are also available in all the three modes. You can thus store 15 individual values (5 max of each type).

2) Pass parameters between lisp and VBA routines.

3) Store as xrecords in user created dictionaries. Using this method, you can permanently store values in a drawing so that they are available in different sessions.

4) Storing a list of objects (as in selection sets) presents special problem. I have overcome this by creating a single concatenated string of object handles with a separator and storing this string using one of the above three methods.

I hope this helps.

Sanjay Kulkarni.

Re:
Hello,

There does not seem to be a simple, straightforward, generalized solution for transferring arrays to from VBA to AutoLISP.

It seems that you need write code for each specific array.

The first hurdle is that AutoLISP does not have arrays. So, you export an array as a list (a list of lists in case of multidimensional arrays.)

Here is a sample code:

Sub array2lst()
Dim Array1(2)
Dim Array2
Dim iElements As Integer
Dim sList As String
Dim iKounter As Integer

' Craeting arrays

Array1(0) = 1
Array1(1) = "A"
Array1(2) = 2.5

Array2 = Array(1, "A", 2.5)

''' Converting Array to string

iElements = UBound(Array1)

sList = "("

For iKounter = 0 To iElements

If TypeName(Array1(iKounter)) = "Straing" Then

sList = sList & Chr(34) & Array1(iKounter) & Chr(34)

Else

sList = sList & Array1(iKounter)

End If

sList = sList & " "

Next

sList = sList & ")"

''' Passing string to Lisp

SendCommand "(getArray " & sList & ")"

' where getarray is an AutoLISP function:
' (defun getArray (lst)
' (setq x (nth lst 0))
' )
End Sub


Hope this helps.

Sanjay Kulkarni.



Data transfer between Lisp and VBA using Vlisp's ActiveX (4 replies)   
Posted by: Russ, Kiwi
Date: Jul/28/02 - 21:32 (GMT)   
I would like to know how to use ActiveX to transfer data via vlisp to VBA.
Frank Oquendo has written an interesting article on his web site at
http://acadx.com (under articles)
"transferring Data between AutoLISP and VBA". He notes 4 options(amoungst
others) to do this:
1) USER1 etc system
variables
2)Text files
3) the registry
4)ActiveX interface
"The direct route"

For me I would like to use "ActiveX interface" method. Here is his
description:
-------------------start article-----------------------------------
Option #4: The direct route
VisualLISP has an ActiveX interface that you can use directly from any
ActiveX enabled client, including VBA. There is no official documentation on
it and the type library is less than helpful so this approach is a bit
harder to implement than most. Fortunately, the hard part has already been
done for you in the form of VLAX.cls (available from you know where). Using
the SetLispSymbol method creates a global variable that can be read from
AutoLISP while GetLispSymbol allows you to read a variable initialized by
AutoLISP. Here's an example:In VBA:
Dim obj As VLAX Set obj = New VLAX obj.SetLispSymbol "test", 5
In AutoLISP, you would just use the symbol TEST which is now bound to 5.
It's that easy. As an added benefit, if the variable you pass to
SetLispSymbol is an array, that array becomes a list in AutoLISP. You can
create nested lists in VBA by embedding arrays withing arrays. However, you
are limited to reading unnested lists using VLAX's GetLispList method. You
can work around this limitation by using EvalLispExpression to excute any
number of list handling functions such as CAR/CDR and NTH.
---------------end article----------------------------------------

What I don't understand is how do I use the vlax function in vlisp to setq
the value(test)? He says that it is written in the form of VLAX.cls with a
link to another site, but I can't access the site. I also don't know what he
means by "from you know where". Does he mean the help file? I have looked in
the help file but to me its not much help.
So how would I make the variable "test" in vlisp compatiable with the
equivalent vba?
Thanks for any help
Russ
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-9-14 09:49:50 | 显示全部楼层
感谢aidraft提供相关信息
以下数点提供同好参考
(1)userr1-5,useri1-5,users1-5均可顺利于vlisp及vba间传递变量,但依照dxf格式说明users1-5并未能于档案关闭后存在,也就是users1-5于档案关闭后再开启,其变量值为空字串符(autocad2002如此),cad2004,2005不知是否有变更此功能.
(2)使用dictionary之功能传递变数也是一个好方法,且相信autocad不太可能中断对dictionary的支援,且使用dictionary即可传递无上限之变量,使用userr1-5,useri1-5,users1-5就仅能使用有限量的变量,且autocad说不定于日后版本可能停止对userr1-5,useri1-5,users1-5支援.
(3)因vlisp对registry的写入读出均有直接之支援,但autocad-vba似乎并未直接对registry支援,但vba支援windows api,相信使用registry来做变量之传递,亦是不错的方法.
最后再次感谢aidraft所提供之相关信息.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2004-9-16 09:18:44 | 显示全部楼层
因vba为建构于acad应用程序中,而lisp建构于acad图形中
本想在a图形中执行vlisp程序,再利用vlisp中之vla-loaddvb及vla-runmacro在b图形中取得点,并将点之xyz值以系统变量userr1-3传递
经测试后vba之macro直接于vba中执行时,一切正常,但附加于vlisp程序后依然受限于lisp建构于acad图形中的限制,无法于b图形中取点
真是令人失望,以上意见供同好参考
另因本人英文水平差且vb水平也差,所以没有试做vlax.cls,但还是感谢aidraft提供相关信息.
如果有人可以利用lisp能跨图档取得信息,希望能给大家做参考.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 11:58 , Processed in 0.196239 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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