BIGAL 发表于 2022-7-5 18:10:01

在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
)

Tharwat 发表于 2022-7-5 18:18:08

你好
 
您的代码中有两次以下版本号,可能这就是为什么它没有达到2016版本的原因。
 

(vl-string-search "R20.0" vrsn)

BlackBox 发表于 2022-7-5 18:22:46

对的2016年为R20.1

BlackBox 发表于 2022-7-5 18:26:05

而且
 

(if vlax-user-product-key                                             ; If 2013+
(vlax-user-product-key)                                             ; Use new function
(vlax-product-key)                                                    ; Use legacy function
)

BlackBox 发表于 2022-7-5 18:27:21

“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
   )
)
)

Lee Mac 发表于 2022-7-5 18:33:20

我不使用垂直软件,但我可以这样编写函数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)))
   )
)

BlackBox 发表于 2022-7-5 18:36:52

请原谅我的提问,李-
 
我假设我忽略了一些事情,因为这些天我很少用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的非零结果;诚然,没有人会在外部对象上多次执行此任务(这是该子函数打算支持的),只是对性能感到好奇。
 
干杯

Lee Mac 发表于 2022-7-5 18:41:06

哦,第二个函数无疑会更快:不需要分配内存来存储提供给vl some的两个列表,并且没有eval语句;然而,性能不是此类表达式的一个因素,因为它们只会被计算一次(因为全局变量在之后被引用)。我只是发现很多重复的表达式只会导致代码相当丑陋。

BlackBox 发表于 2022-7-5 18:44:51

 
很好,谢谢。

BIGAL 发表于 2022-7-5 18:52:41

感谢Blackbox,当我在家发布时,20.0是一个拼写错误。11-12-13只是一个猜测,因为我们刚刚从2013年到2016年,将在明天上班时尝试。用于通过工具栏而不是工具空间更改轮廓和点样式。
页: [1] 2
查看完整版本: 在20中访问CIV3D数据库