明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2953|回复: 9

猫老师的"Vlisp 交互 VB 窗体"的进一步学习心得

[复制链接]
发表于 2013-3-23 20:58 | 显示全部楼层 |阅读模式
本帖最后由 阿然 于 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

对以上错误带来的困扰表示抱歉


评分

参与人数 1明经币 +2 收起 理由
mccad + 2 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2013-3-24 08:29 来自手机 | 显示全部楼层
好资源支持!!!!
发表于 2013-3-24 09:18 | 显示全部楼层
好帖子怎么没有人顶!!
发表于 2013-3-24 10:21 | 显示全部楼层
谢谢楼主分享,测试一下
发表于 2013-3-24 13:01 | 显示全部楼层
好像这种方式一定要CAD中带有VBA才可以调用吧?
 楼主| 发表于 2013-3-25 08:17 | 显示全部楼层
原代码有部分错误,1楼已修改。
发表于 2013-3-25 16:51 | 显示全部楼层
谢谢楼主 先顶后学
发表于 2013-3-28 10:31 | 显示全部楼层
高人哪,留脚印
发表于 2013-3-31 16:23 来自手机 | 显示全部楼层
好老师,好资料!顶一下!!
发表于 2013-9-15 14:45 | 显示全部楼层

好资源支持!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 14:04 , Processed in 0.293598 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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