明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1359|回复: 4

[提问] 高飞鸟大侠请进

[复制链接]
发表于 2018-10-15 20:37:47 | 显示全部楼层 |阅读模式
大侠的动态函数库非常棒
在我的多个程序里都有应用
其中最常用的就是line和pline的替代命令

现在碰到一个困难
不知道是天正的原因还是啥
现在经常碰到天正图纸转成的T3文件
用CAD2012打不开
报错是“dwg版本太高”
或者打开文件在最后的阶段CAD崩溃
这个问题迫使我
不得不安装CAD2017以备不时之需

由于时不时就需要使用2017
所以恳请高大侠能更新一下DynamicLisp函数库
使之可支持2015~2019




另附在函数使用过程中发现的一些问题

1.  对initget函数的影响
get类函数是不区分大小写的
但是程序中使用DynamicLisp以后
输入字符是大写或小写是有区别的
这个问题一度困扰了我很久
最终的结论是DynamicLisp的原因
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=172646

2.  选择集拖动函数视觉效果上的瑕疵
主要体现在鼠标不能“静止”
一旦静止动态显示的图元会“消隐”
从这一点来说express里的拖动函数的效果比较好

3.  低版本CAD中必须先卸载才能关闭dwg
如果不先卸载就关闭dwg
CAD会出现多个错误提示
解决办法是设置了一个文档反应器
关闭文档前先arxunload
这个问题在以前使用2004的时候存在
现在用的2012经测不存在这个问题

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2019-6-10 18:48:44 | 显示全部楼层
曾经想过下载高大侠的源码
自己试着编译2015以上版本的ARX
结果链接跳过去一看
源码早就撤销了~~~~

 楼主| 发表于 2019-6-10 18:54:19 | 显示全部楼层
关于lisp+DWX的编程心得
高飞鸟、不死猫、yxp等好多高手都有专题论述
奈何完全不懂vb这些
看得吃力碰到问题就抓瞎

yxp给出了如何获取已打开程序窗口的方法
但是没有给出如何关闭的方法
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=177021

CAD打印PDF后会自动打开PDF浏览器
用yxp的方法已做到获取PDF浏览器窗口句柄
并实现CAD与PDF浏览器平铺方便对照
但是实际批打印时还需要一个关闭PDF浏览器的功能
打印图纸数量非常多比如上千张时
我的设想是
每打印50张关闭浏览器一次
避免内存占用太多

;;变量初始化
(setq *acad*   (vlax-get-acad-object)
        *doc*     (vla-get-ActiveDocument *acad*)
        hCAD      (vla-get-hwnd *acad*)                                      ;;顶层 CAD 对象句柄
        hdwg      (vla-get-hwnd *doc*)                                        ;;当前 dwg 对象句柄
        *dwx*     (vlax-get-or-create-object "DynamicWrapperX")   ;;创建一个 DWX 对象
)

;;Windows API 函数声明
(vlax-invoke *dwx* 'Register "shell32.dll" "ShellExecuteW" "i=hwwwwl" "r=m")
(vlax-invoke *dwx* 'Register "user32" "SetWindowTextW" "i=hw" "r=m")
(vlax-invoke *dwx* 'Register "user32" "GetKeyState" "i=n" "r=l")
(vlax-invoke *dwx* 'Register "user32" "keybd_event" "i=llll" "r=m")
(vlax-invoke *dwx* 'Register "user32" "SetWindowPos" "i=hmmmmmm" "r=m")
(vlax-invoke *dwx* 'Register "kernel32" "Beep" "i=mm" "r=m")
(vlax-invoke *dwx* 'Register "kernel32" "Sleep" "i=m")

(setq name "SD-51"   pdf_num 51)                                     ;;假定已打印50张
(setq jsb (get-fun-hand hCAD (strcat "*" name "*.pdf*")))    ;;获取PDF浏览器窗体的句柄

;(if (> pdf_num 50)
   (...)                                   ;;已获取窗体句柄的情况下,如何关闭窗体???
;)

看帮助似乎要用到“CloseHandle”
但是下面的语句没能达到预期的目的
(vlax-invoke *dwx* 'Register "kernel32" "CloseHandle" "i=h")
(vlax-invoke *dwx* 'CloseHandle jsb)

所谓难者不会会者不难
还望高大侠等诸位高手抽空指点一二
 楼主| 发表于 2019-6-10 19:42:43 | 显示全部楼层
(defun c:test (/ kwordCallback OtherCallback ss)
  (defun kwordCallback (Kword /)                                ;关键字回调函数
         (princ (strcat "\n选择了关键字: " kword))
         (cond
           ( (= kword "XCircle")
             (ssget "x" '((0 . "CIRCLE")))
           )
           ( (= kword "XLine")
             (ssget "x" '((0 . "LINE")))
           )
           (T (princ "\n错误的关键字。"))
         )
        )
        (defun OtherCallback (Kword /)                                ;非关键字回调函数
         (princ (strcat "\n选择了非关键字: " kword))
         kword
        )

  (vl-acad-defun 'kwordCallback)                                ;让lisp函数能被arx调用
  (vl-acad-defun 'OtherCallback)                                ;让lisp函数能被arx调用

  (sssetfirst nil nil)                                          
  (HFB_initGet  "选择对象或[全部圆(XC)/所有直线(XL)]: "                ;选择时的提示
                     "XCircle XLine_XCircle XLine"                        ;关键字        
                 "kwordCallback"                                ;关键字回调函数名
                 "OtherCallback"                                ;非关键字回调函数名
                 "移除物体: "                                        ;移除选择时的提示
  )
  (setq        ss (HFB_SSGet))                                                ;开始自定义关键字选择.
  (cond
    ( (= (type ss) 'STR)
      (princ (strcat "\n你输入了关键字: " ss))
    )        
    ( (= (type ss) 'PICKSET)
      (princ "\n你的选择集是:")
      (princ ss)
      (princ ", 选择集中图元个数是: ")
      (princ (sslength ss))
      (sssetfirst ss ss)
      (HFB_ssFree ss)                                                ;释放选择集
    )
  )
(princ)
)

以上是【DynamicLisp的高级应用】-- 带关键字的SSGET 一贴中的范例
根据程序
如果输入的是非关键字
应该返回“错误的关键字。”或“选择了非关键字:”
但在64位win7+CAD2012中
非关键字输入并不能调用“OtherCallback”或者“kwordCallback”
而是如普通选择一样出现“*无效选择* ......”等信息
关键字输入运行没问题
发表于 2020-11-2 14:18:37 | 显示全部楼层
一样出现“*无效选择* ......”等信息
关键字输入运行没问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-22 23:27 , Processed in 0.212133 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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