在20中访问CIV3D数据库
我现在有问题,我已经安装了CIV3D 2016,这个例程会出现错误,我知道appstr“13.0”可能是错误的数字,但我似乎在尝试其他数字之前出现了错误。有什么需要帮忙的吗?;vercheck.lspversion check for *aecc objects
; By Alan H
(defun ah:vercheck ( / vrsn appstr)
(vl-load-com)
(if ((lambda (vrsn)
(cond
((vl-string-search "R17.2" vrsn) (setq appstr "6.0")) ;09
((vl-string-search "R18.0" vrsn) (setq appstr "7.0")) ;10
((vl-string-search "R18.1" vrsn) (setq appstr "8.0")) ;11
((vl-string-search "R18.2" vrsn) (setq appstr "9.0")) ;12 ?
((vl-string-search "R19.0" vrsn) (setq appstr "10.0")) ;13
((vl-string-search "R19.1" vrsn)(setq appstr "11.0"));;2014
((vl-string-search "R20.0" vrsn)(setq appstr "12.0"));;2015
((vl-string-search "R20.1" vrsn)(setq appstr "13.0"));;2016
((alert "This version of C3D not supported!"))
)
)
(vlax-product-key)
) ; end if condition progn is true
(progn
(cond (*AeccDoc*)
((setq *AeccDoc*
(vlax-get
(cond (*AeccApp*)
((setq *AeccApp*
(vla-getinterfaceobject
(cond (*Acad*)
((setq *Acad* (vlax-get-acad-object)))
)
(strcat "AeccXUiLand.AeccApplication." appstr)
)
)
)
)
'ActiveDocument
)
)
)
) ; end main cond
) ; end progn
) ; end if vsrn
) 你好
您的代码中有两次以下版本号,可能这就是为什么它没有达到2016版本的原因。
(vl-string-search "R20.0" vrsn)
对的2016年为R20.1 而且
(if vlax-user-product-key ; If 2013+
(vlax-user-product-key) ; Use new function
(vlax-product-key) ; Use legacy function
)
“11.0”、“12.0”和“13.0”是从哪里来的?
(vl-load-com)
(defun _GetAeccDocument ()
((lambda (vrsn)
(if
(setq vrsn
(cond
((vl-string-search "20.1" vrsn) "10.5") ; 2016
((vl-string-search "20.0" vrsn) "10.4") ; 2015
((vl-string-search "19.1" vrsn) "10.3") ; 2014
((vl-string-search "19.0" vrsn) "10.0") ; 2013
((vl-string-search "18.2" vrsn) "9.0") ; 2012
((vl-string-search "18.1" vrsn) "8.0") ; 2011
((vl-string-search "18.0" vrsn) "7.0") ; 2010
((vl-string-search "17.2" vrsn) "6.0") ; 2009
((vl-string-search "17.1" vrsn) "5.0") ; 2008
)
)
(setq *AeccDoc*
(vlax-get
(cond (*AeccApp*)
((setq *AeccApp*
(vla-getinterfaceobject
(cond (*Acad*)
((setq *Acad* (vlax-get-acad-object)))
)
(strcat "AeccXUiLand.AeccApplication." vrsn)
)
)
)
)
'ActiveDocument
)
)
)
)
(if vlax-user-product-key ; If 2013+
(vlax-user-product-key) ; Use new function
(vlax-product-key) ; Use legacy function
)
)
)
我不使用垂直软件,但我可以这样编写函数FWIW:
如果getinterfaceobject方法失败,或者找不到版本号,则可以包括额外的错误捕获:
(defun _aeccdocument nil
(cond
( *aeccdoc* )
( (_aeccapp) (setq *aeccdoc* (vlax-get (_aeccapp) 'activedocument)))
)
)
(defun _aeccapp ( / err str )
(cond
( *aeccapp* )
( ( (lambda ( v )
(not
(vl-some
'(lambda ( a b ) (if (vl-string-search a v) (setq str b)))
'("20.1" "20.0" "19.1" "19.0" "18.2" "18.1" "18.0" "17.2" "17.1")
'("10.5" "10.4" "10.3" "10.0""9.0""8.0""7.0""6.0""5.0")
)
)
)
((eval (cond (vlax-user-product-key) (vlax-product-key))))
)
(prompt "\nIncompatible version.")
)
( (vl-catch-all-error-p
(setq err
(vl-catch-all-apply 'vla-getinterfaceobject
(list (_acapp) (strcat "aeccxuiland.aeccapplication." str))
)
)
)
(prompt (vl-catch-all-error-message err))
)
( (setq *aeccapp* err))
)
)
(defun _acapp ( )
(cond
( *acapp* )
( (setq *acapp* (vlax-get-acad-object)))
)
) 请原谅我的提问,李-
我假设我忽略了一些事情,因为这些天我很少用LISP进行编码——为什么这两个函数(我*相信*是等效的)在性能上有这么大的差异?
示例函数:
(defun _Sample1 ()
((lambda (v)
(vl-some
'(lambda (a b) (if (vl-string-search a v) (setq s b)))
'("20.1" "20.0" "19.1" "19.0" "18.2" "18.1" "18.0" "17.2" "17.1")
'("10.5" "10.4" "10.3" "10.0""9.0""8.0""7.0""6.0""5.0")
)
)
((eval (cond (vlax-user-product-key) (vlax-product-key))))
)
)
(defun _Sample2 ()
((lambda (vrsn)
(cond
((vl-string-search "20.1" vrsn) "10.5") ; 2016
((vl-string-search "20.0" vrsn) "10.4") ; 2015
((vl-string-search "19.1" vrsn) "10.3") ; 2014
((vl-string-search "19.0" vrsn) "10.0") ; 2013
((vl-string-search "18.2" vrsn) "9.0") ; 2012
((vl-string-search "18.1" vrsn) "8.0") ; 2011
((vl-string-search "18.0" vrsn) "7.0") ; 2010
((vl-string-search "17.2" vrsn) "6.0") ; 2009
((vl-string-search "17.1" vrsn) "5.0") ; 2008
)
)
(if vlax-user-product-key ; If 2013+
(vlax-user-product-key) ; Use new function
(vlax-product-key) ; Use legacy function
)
)
)
控制台结果:
7
我增加了迭代次数,以获得样本2的非零结果;诚然,没有人会在外部对象上多次执行此任务(这是该子函数打算支持的),只是对性能感到好奇。
干杯 哦,第二个函数无疑会更快:不需要分配内存来存储提供给vl some的两个列表,并且没有eval语句;然而,性能不是此类表达式的一个因素,因为它们只会被计算一次(因为全局变量在之后被引用)。我只是发现很多重复的表达式只会导致代码相当丑陋。
很好,谢谢。 感谢Blackbox,当我在家发布时,20.0是一个拼写错误。11-12-13只是一个猜测,因为我们刚刚从2013年到2016年,将在明天上班时尝试。用于通过工具栏而不是工具空间更改轮廓和点样式。
页:
[1]
2