明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1794|回复: 6

UCS错误问题!!

[复制链接]
发表于 2007-1-25 10:05:00 | 显示全部楼层 |阅读模式
在WCS中自己用3点法建立了一个UCS,但未命名,然后运行程序.
程序的思路是:
如果当前UCS未命名,则根据当前UCS建立UCS,否则存储当前UCS.(当然要用ActiveX,用命令行不会出错)
运行过程中出现了如下错误:
Automation 错误。 UCS X 轴与 Y 轴不垂直
  1.   (if (= (getvar "UCSNAME") "")
  2.     (setq OldOrg (vla-GetVariable *Doc "UCSORG")
  3.      OldXDr (vla-getVariable *Doc "UCSXDIR")
  4.    OldYDr (vla-getVariable *Doc "UCSYDIR")
  5.    Org    (vla-translatecoordinates *Uti OldOrg acucs acworld 0)
  6.    XDir   (vla-TranslateCoordinates *Uti OldXDr acUCS acWorld 0)
  7.    YDir   (vla-TranslateCoordinates *Uti OldYDr acUCS acWorld 0)
  8.    OldUcs (vla-add *Ucs OldOrg XDir YDir "OLDUCS");出错!!!
  9.    OldUcs (vla-add *Ucs Org XDir YDir "OLDUCS")   ;如果是这样也会出错!
  10.     )
  11.     (setq OldUcs (vla-get-activeucs *Doc))
  12.   )
这是我根据ActiveUcs的范例编写的,我把这个范例在VBA 中运行,也出同样的错误!
根据ahlzl版主的指点认为是精度问题,但我改进后同样会出错,该怎样改进这个程序呢?
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2015-4-16 13:44:43 | 显示全部楼层
本帖最后由 鱼与熊掌 于 2015-4-16 13:47 编辑
  1. ;获取当前UCS的矩阵.
  2. ;感谢高飞鸟和龙龙仔在论坛的讨论.
  3. ;鱼与熊掌.2015 04 15
  4. (defun cx-Get-ActiveUcsMat(/ olducs)
  5.   (vla-GetUCSMatrix
  6.     (if (= (getvar "UCSNAME") "")
  7.       (progn
  8.         (vla-put-origin
  9.           (setq OldUcs(vla-add
  10.               *UCS*
  11.               (vlax-3d-point '(0 0 0))
  12.               (vla-getvariable *DOC* "UCSXDIR")
  13.               (vla-getvariable *DOC* "UCSYDIR")
  14.               "Cx_Tem_UCS"
  15.             )
  16.           )
  17.           (vla-getvariable *DOC* "UCSORG")
  18.         )
  19.         OldUcs
  20.       )
  21.       (vla-get-activeucs *DOC*)
  22.     )
  23.   )
  24. )
回复 支持 1 反对 0

使用道具 举报

发表于 2007-1-25 11:38:00 | 显示全部楼层
程序是對的,我執行沒有問題(希望下次*Doc,*Uti,*Ucs能直接貼上-----可能這些錯了!)
 楼主| 发表于 2007-1-25 12:09:00 | 显示全部楼层

问题是有时候对,有时候错,我完整地贴出代码:
  1. (defun C:uu ()
  2.   (vl-load-com)
  3.   (setq *Obj (vlax-get-acad-object)
  4. *Doc (vla-get-activeDocument *Obj)
  5. *MSp (vla-get-Modelspace *Doc)
  6.         *Uti (vla-get-Utility *Doc)
  7. *Ucs (vla-get-UserCoordinateSystems *Doc)
  8.   )
  9.   (if (= (getvar "UCSNAME") "")
  10.     (setq OldOrg (vla-GetVariable *Doc "UCSORG")
  11.      OldXDr (vla-getVariable *Doc "UCSXDIR")
  12.    OldYDr (vla-getVariable *Doc "UCSYDIR")
  13.    Org    (vla-translatecoordinates *Uti OldOrg acucs acworld 0)
  14.    XDir   (vla-TranslateCoordinates *Uti OldXDr acUCS acWorld 0)
  15.    YDir   (vla-TranslateCoordinates *Uti OldYDr acUCS acWorld 0)
  16.    OldUcs (vla-add *Ucs OldOrg XDir YDir "OLDUCS111");;出错!!
  17.    OldUcs (vla-add *Ucs Org XDir YDir "OLDUCS111")
  18.     )
  19.     (setq OldUcs (vla-get-activeucs *Doc))
  20.   )
  21.   ;;..............
  22. )
发表于 2007-1-26 11:32:00 | 显示全部楼层
本帖最后由 作者 于 2007-1-26 11:40:55 编辑

;;你對"UCSXDIR" & "UCSYDIR"可能理解錯了,但我也在找轉換的方法
(defun C:UU ()
  (vl-load-com)
  (setq *APP (vlax-get-acad-object)
 *DOC (vla-get-activedocument *APP)
 *UTI (vla-get-utility *DOC)
 *UCS (vla-get-usercoordinatesystems *DOC)
  )
  (if (= (getvar "UCSNAME") "")
    (progn
      (setq OLDORG (vla-getvariable *DOC "UCSORG")
     OLDXDR (vla-getvariable *DOC "UCSXDIR")
     OLDYDR (vla-getvariable *DOC "UCSYDIR")
      )
      (setq OLDUCS
      (vla-add
        *UCS
        (vlax-3d-point '(0 0 0))
        OLDXDR
        OLDYDR
        "OLDUCS111"
      )
      )
    )
    (setq OLDUCS (vla-get-activeucs *DOC))
  )
  (princ)
)
 楼主| 发表于 2007-1-26 14:20:00 | 显示全部楼层
本帖最后由 作者 于 2007-1-26 14:29:46 编辑

非常感谢龙版主的调试.

但好像上面的程序也不正确,结果算出来的UCS坐标原点总是跟世界坐标原点重合,它的UCS方向是正确的。

而我的那个是有时候正确有时又弹出错误对话框,很迷惑。依据ahlzl版主的说话,可能是精度影响判断,好像是CAD的一个bug,就像等分样条曲线那样的浮点错误。

希望望总版主也能过来看看,指出错误!

 楼主| 发表于 2007-1-26 16:59:00 | 显示全部楼层
本帖最后由 作者 于 2007-1-26 17:27:55 编辑

问题解决,龙版主的指点是正确的,再次感谢!
(defun C:uu ()
  (vl-load-com)
  (setq *APP (vlax-get-acad-object)
        *DOC (vla-get-activeDocument *APP) 
        *MSP (vla-get-Modelspace *DOC)                      ;可以不用这句
        *UTI (vla-get-Utility *DOC)                         ;取得Utility集
        *UCS (vla-get-UserCoordinateSystems *DOC)           ;取得UCS集
  )
  (if (= (getvar "UCSNAME") "")                             ;当前UCS名,如果未命名,则
    (progn
      (setq OldOrg (vla-GetVariable *DOC "UCSORG")          ;取当前UCS原点
            OldXDr (vla-getVariable *DOC "UCSXDIR")         ;取当前X方向
            OldYDr (vla-getVariable *DOC "UCSYDIR")         ;取当前Y方向
            OldUcs (vla-add *UCS 
                            (vlax-3d-point '(0 0 0)) 
                            OldXDr OldYDr "OLDUCS")  
                                                                                                              
      ) ;建立当前UCS,但原点在(0,0,0)处 
      (vla-put-origin OldUcs OldOrg)                        ;改变原点为当前UCS原点
    )
    (setq OldUcs (vla-get-activeucs *DOC))                  ;取得UCS物体
  )                         
  (princ)
)
奇怪的很,如果你不用(vlax-3d-point '(0 0 0)),而直接使用OldOrg就会出现错误!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-22 08:17 , Processed in 0.204618 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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