highflybir 发表于 2007-1-25 10:05:00

UCS错误问题!!

在WCS中自己用3点法建立了一个UCS,但未命名,然后运行程序.
程序的思路是:
如果当前UCS未命名,则根据当前UCS建立UCS,否则存储当前UCS.(当然要用ActiveX,用命令行不会出错)
运行过程中出现了如下错误:
Automation 错误。 UCS X 轴与 Y 轴不垂直

(if (= (getvar "UCSNAME") "")
    (setq OldOrg (vla-GetVariable *Doc "UCSORG")
   OldXDr (vla-getVariable *Doc "UCSXDIR")
   OldYDr (vla-getVariable *Doc "UCSYDIR")
   Org    (vla-translatecoordinates *Uti OldOrg acucs acworld 0)
   XDir   (vla-TranslateCoordinates *Uti OldXDr acUCS acWorld 0)
   YDir   (vla-TranslateCoordinates *Uti OldYDr acUCS acWorld 0)
   OldUcs (vla-add *Ucs OldOrg XDir YDir "OLDUCS");出错!!!
   OldUcs (vla-add *Ucs Org XDir YDir "OLDUCS")   ;如果是这样也会出错!
    )
    (setq OldUcs (vla-get-activeucs *Doc))
)
这是我根据ActiveUcs的范例编写的,我把这个范例在VBA 中运行,也出同样的错误!
根据ahlzl版主的指点认为是精度问题,但我改进后同样会出错,该怎样改进这个程序呢?

鱼与熊掌 发表于 2015-4-16 13:44:43

本帖最后由 鱼与熊掌 于 2015-4-16 13:47 编辑

;获取当前UCS的矩阵.
;感谢高飞鸟和龙龙仔在论坛的讨论.
;鱼与熊掌.2015 04 15
(defun cx-Get-ActiveUcsMat(/ olducs)
(vla-GetUCSMatrix
    (if (= (getvar "UCSNAME") "")
      (progn
      (vla-put-origin
          (setq OldUcs(vla-add
            *UCS*
            (vlax-3d-point '(0 0 0))
            (vla-getvariable *DOC* "UCSXDIR")
            (vla-getvariable *DOC* "UCSYDIR")
            "Cx_Tem_UCS"
            )
          )
          (vla-getvariable *DOC* "UCSORG")
      )
      OldUcs
      )
      (vla-get-activeucs *DOC*)
    )
)
)

龙龙仔 发表于 2007-1-25 11:38:00

程序是對的,我執行沒有問題(希望下次*Doc,*Uti,*Ucs能直接貼上-----可能這些錯了!)

highflybir 发表于 2007-1-25 12:09:00


问题是有时候对,有时候错,我完整地贴出代码:

(defun C:uu ()
(vl-load-com)
(setq *Obj (vlax-get-acad-object)
*Doc (vla-get-activeDocument *Obj)
*MSp (vla-get-Modelspace *Doc)
      *Uti (vla-get-Utility *Doc)
*Ucs (vla-get-UserCoordinateSystems *Doc)
)
(if (= (getvar "UCSNAME") "")
    (setq OldOrg (vla-GetVariable *Doc "UCSORG")
   OldXDr (vla-getVariable *Doc "UCSXDIR")
   OldYDr (vla-getVariable *Doc "UCSYDIR")
   Org    (vla-translatecoordinates *Uti OldOrg acucs acworld 0)
   XDir   (vla-TranslateCoordinates *Uti OldXDr acUCS acWorld 0)
   YDir   (vla-TranslateCoordinates *Uti OldYDr acUCS acWorld 0)
   OldUcs (vla-add *Ucs OldOrg XDir YDir "OLDUCS111");;出错!!
   OldUcs (vla-add *Ucs Org XDir YDir "OLDUCS111")
    )
    (setq OldUcs (vla-get-activeucs *Doc))
)
;;..............
)

龙龙仔 发表于 2007-1-26 11:32:00

本帖最后由 作者 于 2007-1-26 11:40:55 编辑 <br /><br /> ;;你對"UCSXDIR" &amp; "UCSYDIR"可能理解錯了,但我也在找轉換的方法<br/>(defun C:UU ()<br/>&nbsp; (vl-load-com)<br/>&nbsp; (setq&nbsp;*APP (vlax-get-acad-object)<br/>&nbsp;*DOC (vla-get-activedocument *APP)<br/>&nbsp;*UTI (vla-get-utility *DOC)<br/>&nbsp;*UCS (vla-get-usercoordinatesystems *DOC)<br/>&nbsp; )<br/>&nbsp; (if (= (getvar "UCSNAME") "")<br/>&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq OLDORG (vla-getvariable *DOC "UCSORG")<br/>&nbsp;&nbsp;&nbsp;&nbsp; OLDXDR (vla-getvariable *DOC "UCSXDIR")<br/>&nbsp;&nbsp;&nbsp;&nbsp; OLDYDR (vla-getvariable *DOC "UCSYDIR")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq OLDUCS<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-add<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *UCS<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vlax-3d-point '(0 0 0))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OLDXDR<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OLDYDR<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "OLDUCS111"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (setq OLDUCS (vla-get-activeucs *DOC))<br/>&nbsp; )<br/>&nbsp; (princ)<br/>)<br/>

highflybir 发表于 2007-1-26 14:20:00

本帖最后由 作者 于 2007-1-26 14:29:46 编辑 <br /><br /> <p>非常感谢龙版主的调试.</p><p>但好像上面的程序也不正确,结果算出来的UCS坐标原点总是跟世界坐标原点重合,它的UCS方向是正确的。</p><p>而我的那个是有时候正确有时又弹出错误对话框,很迷惑。依据ahlzl版主的说话,可能是精度影响判断,好像是CAD的一个bug,就像等分样条曲线那样的浮点错误。</p><p>希望望总版主也能过来看看,指出错误!</p>

highflybir 发表于 2007-1-26 16:59:00

本帖最后由 作者 于 2007-1-26 17:27:55 编辑 <br /><br /> <pre><font size="1">问题解决,龙版主的指点是正确的,再次感谢!</font></pre><pre><font size="1">(defun C:uu ()<br/>&nbsp; (vl-load-com)<br/>&nbsp; (setq *APP (vlax-get-acad-object)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*DOC (vla-get-activeDocument *APP)&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*MSP (vla-get-Modelspace *DOC)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;可以不用这句<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *UTI (vla-get-Utility *DOC)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;取得Utility集<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*UCS (vla-get-UserCoordinateSystems *DOC)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;取得UCS集<br/>&nbsp; )<br/>&nbsp; (if (= (getvar "UCSNAME") "")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;当前UCS名,如果未命名,则<br/>&nbsp;&nbsp;&nbsp; (progn <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq OldOrg (vla-GetVariable *DOC "UCSORG")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;取当前UCS原点<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OldXDr (vla-getVariable *DOC "UCSXDIR")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;取当前X方向<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OldYDr (vla-getVariable *DOC "UCSYDIR")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;取当前Y方向<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OldUcs (vla-add *UCS&nbsp;</font></pre><pre><font size="1">                            (vlax-3d-point '(0 0 0)) </font></pre><pre><font size="1">                            OldXDr OldYDr&nbsp;"OLDUCS")</font></pre><pre><font size="1">                                                            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )                                                   ;建立当前UCS,但原点在(0,0,0)处&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-origin OldUcs OldOrg)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;改变原点为当前UCS原点<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (setq OldUcs (vla-get-activeucs *DOC))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;取得UCS物体<br/>&nbsp; )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp; (princ)<br/>)</font></pre><pre><font size="1">奇怪的很,如果你不用(vlax-3d-point '(0 0 0)),而直接使用OldOrg就会出现错误!</font></pre>
页: [1]
查看完整版本: UCS错误问题!!