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: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*)
)
)
) 程序是對的,我執行沒有問題(希望下次*Doc,*Uti,*Ucs能直接貼上-----可能這些錯了!)
问题是有时候对,有时候错,我完整地贴出代码:
(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:40:55 编辑 <br /><br /> ;;你對"UCSXDIR" & "UCSYDIR"可能理解錯了,但我也在找轉換的方法<br/>(defun C:UU ()<br/> (vl-load-com)<br/> (setq *APP (vlax-get-acad-object)<br/> *DOC (vla-get-activedocument *APP)<br/> *UTI (vla-get-utility *DOC)<br/> *UCS (vla-get-usercoordinatesystems *DOC)<br/> )<br/> (if (= (getvar "UCSNAME") "")<br/> (progn<br/> (setq OLDORG (vla-getvariable *DOC "UCSORG")<br/> OLDXDR (vla-getvariable *DOC "UCSXDIR")<br/> OLDYDR (vla-getvariable *DOC "UCSYDIR")<br/> )<br/> (setq OLDUCS<br/> (vla-add<br/> *UCS<br/> (vlax-3d-point '(0 0 0))<br/> OLDXDR<br/> OLDYDR<br/> "OLDUCS111"<br/> )<br/> )<br/> )<br/> (setq OLDUCS (vla-get-activeucs *DOC))<br/> )<br/> (princ)<br/>)<br/> 本帖最后由 作者 于 2007-1-26 14:29:46 编辑 <br /><br /> <p>非常感谢龙版主的调试.</p><p>但好像上面的程序也不正确,结果算出来的UCS坐标原点总是跟世界坐标原点重合,它的UCS方向是正确的。</p><p>而我的那个是有时候正确有时又弹出错误对话框,很迷惑。依据ahlzl版主的说话,可能是精度影响判断,好像是CAD的一个bug,就像等分样条曲线那样的浮点错误。</p><p>希望望总版主也能过来看看,指出错误!</p> 本帖最后由 作者 于 2007-1-26 17:27:55 编辑 <br /><br /> <pre><font size="1">问题解决,龙版主的指点是正确的,再次感谢!</font></pre><pre><font size="1">(defun C:uu ()<br/> (vl-load-com)<br/> (setq *APP (vlax-get-acad-object)<br/> *DOC (vla-get-activeDocument *APP) <br/> *MSP (vla-get-Modelspace *DOC) ;可以不用这句<br/> *UTI (vla-get-Utility *DOC) ;取得Utility集<br/> *UCS (vla-get-UserCoordinateSystems *DOC) ;取得UCS集<br/> )<br/> (if (= (getvar "UCSNAME") "") ;当前UCS名,如果未命名,则<br/> (progn <br/> (setq OldOrg (vla-GetVariable *DOC "UCSORG") ;取当前UCS原点<br/> OldXDr (vla-getVariable *DOC "UCSXDIR") ;取当前X方向<br/> OldYDr (vla-getVariable *DOC "UCSYDIR") ;取当前Y方向<br/> OldUcs (vla-add *UCS </font></pre><pre><font size="1"> (vlax-3d-point '(0 0 0)) </font></pre><pre><font size="1"> OldXDr OldYDr "OLDUCS")</font></pre><pre><font size="1"> <br/> ) ;建立当前UCS,但原点在(0,0,0)处 <br/> (vla-put-origin OldUcs OldOrg) ;改变原点为当前UCS原点<br/> )<br/> (setq OldUcs (vla-get-activeucs *DOC)) ;取得UCS物体<br/> ) <br/> (princ)<br/>)</font></pre><pre><font size="1">奇怪的很,如果你不用(vlax-3d-point '(0 0 0)),而直接使用OldOrg就会出现错误!</font></pre>
页:
[1]