- 积分
- 6309
- 明经币
- 个
- 注册时间
- 2012-11-13
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 阿然 于 2013-3-25 08:17 编辑
猫老师原贴传送门在这里http://bbs.mjtd.com/thread-78480-1-1.html
看过猫老师这个帖子以后获益非浅,感觉有必要进一步进行学习现介绍心得体会如下:
1.猫老师的帖子里介绍的lisp交互vb窗体内数据是采用while来进行,会产生一种cad悬停等待窗体输入的感觉,但是这种做法太占用cpu,经过思考,觉得采用反应器触发lisp去获取窗体内容比较合适。
2.猫老师的文章里面没有介绍如果卸载窗体,本人另外添加了卸载窗体的代码。
下面是具体代码介绍:
首先是lisp代码:
这里采用系统变量反应器来触发lisp与vb窗体的交互,当然可以考虑其他反应器。
(if (not *sysvarReactor*)
(setq *sysvarReactor*
(vlr-sysvar-reactor
nil
'
(
(:vlr-sysVarChanged . sysvarchanged)
)
)
)
)
(defun sysvarchanged (reactor sysvar)
(if (equal (strcase (car sysvar)) "*USERS5") ;_按下确定
(progn
(setq frmname (getvar 'users5))
(cond
((= frmname "Form1")
(alert (Vlax-get-Property (vlax-get frm 'Text3) 'Text)));_获取窗体内控件信息
((= frmname "Form2")
(princ));_加入有其他的窗体需要操作
)
(vlax-invoke-method nonsmall 'unloadfrm frmname) ;_卸载窗体
;_这里可以添加删除反应器之类的其他代码
)
)
)
(defun c:tt ()
(vl-load-com)
(setq ACAD (Vlax-Get-Acad-Object))
(setq Doc (Vlax-Get (Vlax-Get ACAD 'ActiveDocument) 'ModelSpace))
(if (not (setq nonsmall (Vlax-Create-Object "nonsmall.Test"))) ;_这里是工程名.类名
(startapp "regsvr32 C:\\nonsmall.dll /s") ;_注册DLL 这里改成你制作的DLL路径
)
(setq nonsmall (Vlax-Create-Object "nonsmall.Test"))
(setq
frm (Vlax-Invoke-Method nonsmall 'ShowWnd (Vlax-Get ACAD 'HWND))
)
(princ)
)
接下来是vb部分(一下改动都是在猫老师的代码上修改,请通过上面的传送门下载):
1.在猫老师的vb代码中添加第三个文本框text32.添加两个按钮,分别命名为cmdok和cmdcancel
3.test.cls中添加下列代码
Public Function unloadfrm(byval frmname as string)
Unload frmname
End Function
3.在form1.frm中添加下列代码
Public AcadApp As Object
Public AcadDoc As Object
Public Sub InitCAD()
On Error Resume Next
Set AcadApp = GetObject(, "AutoCAD.application")
If Err Then
MsgBox Err.Description
Exit Sub
End If
AcadApp.Visible = True
Set AcadDoc = AcadApp.ActiveDocument
End Sub
Private Sub cmdcancel_Click()
Unload Form1
End Sub
Private Sub cmdok_Click()
AcadDoc.SetVariable "UserS5", "Form1"
Form1.Hide
End Sub
Private Sub Form_Load()
Call InitCAD
End Sub
重新生成猫老师的nonsmall.dll,并加载lsp,即可进行测试
更正一下,vb代码中frmname不能作为作为字符串参数传递给unload
对下面的代码修改
Public Function unloadfrm(byval frmname as string)
Unload frmname
End Function
修改为
Public Function unloadfrm(ByVal frmname As String)
Select Case frmname
Case "Form1"
Unload Form1
Case "form2"
Unload form2
Case Else
MsgBox "未找到名为" & frmname & "的窗体!", vbCritical + vbOKOnly, "错误"
End Select
End Function
对以上错误带来的困扰表示抱歉
|
评分
-
查看全部评分
|