明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 785|回复: 4

[资源] cad程序视图问题,请大神指点

[复制链接]
发表于 2017-11-10 22:48 来自手机 | 显示全部楼层 |阅读模式
cad 中的很多插件默认的只能在顶视图中自动生成图形和使用,转换到其他视图就不能用了,要怎么修改才能在其它视图里正常使用呢,有知道的朋友,求指点

比如下面这个程序就只能在cad的俯视图里使用,找了半天不知道什么原因



xy轴比例调节
(defun C:11 (/ bp ss xscal yscal entL)
  (setvar "qaflags" 0)
  (defun errexit (s)
    (princ "\nError:  ")
    (princ s)
    (restore)
  )

  (defun restore ()
    (setvar "CMDECHO" (car oldvar))
    (setq *error* olderr)
    (princ)
  )

  (defun MAKEUNBLOCK (ss ip / tmp errexit mbx BLAYER)
    (setq olderr  *error*
          *error* errexit
    )
    (setq oldvar (list (getvar "CMDECHO")))
    (setvar "CMDECHO" 0)
    (terpri)
    (if        BLAYER
      (command "._LAYER"
               (if (tblsearch "LAYER" BLAYER)
                 "_S"
                 "_M"
               )
               BLAYER
               ""
      )
    )
    (if        (and
          ip
          ss
        )
      (progn
        (entmake (list (cons '0 "BLOCK")
                       (cons '2 "*U")
                       (cons '70 1)
                       (cons '10 ip)
                 )
        )
        (setq cnt (sslength ss))
        (while (>= (setq cnt (1- cnt))
                   0
               )
          (setq tmp (ssname ss cnt))
          (entmake (setq el (entget tmp)))
          (if (> (cdr (assoc 66 el)) 0)
            (while (/= "SEQEND"
                       (cdr (assoc 0
                                   (entmake (setq el
                                                   (entget
                                                     (entnext
                                                       (cdr
                                                         (assoc -1 el)
                                                       )
                                                     )
                                                   )
                                            )
                                   )
                            )
                       )
                   )
            )
          )
          (entdel tmp)
        )
        (setq tmp (entmake (list (cons '0 "ENDBLK"))))
        (entmake
          (list (cons '0 "INSERT") (cons '2 tmp) (cons '10 ip))
        )
      )
    )
    (restore)
  )
  (setq ss (cadr (ssgetfirst)))
  (while (= ss nil)
    (setq ss (ssget))                        ; 选择缩放实体
  )
  (setq        i 0
        dwcorn nil
        upcorn nil
  )
  (repeat (sslength ss)
    (setq ent (ssname ss i))
    (setq obj (vlax-ename->vla-object ent))
    (vla-GetBoundingBox obj 'pta 'ptb)
    (setq dwcorn (cons (vlax-safearray->list pta) dwcorn))
    (setq upcorn (cons (vlax-safearray->list ptb) upcorn))
    (setq i (1+ i))
  )
  (setq        ptlist (append
                 dwcorn
                 upcorn
               )
  )
  (setq        x (mapcar
            'car
            ptlist
          )
  )
  (setq        y (mapcar
            'cadr
            ptlist
          )
  )
  (setq        x1 (apply
             'min
             x
           )
  )
  (setq        y1 (apply
             'min
             y
           )
  )
  (setq        x2 (apply
             'max
             x
           )
  )
  (setq        y2 (apply
             'max
             y
           )
  )
  (setq xx (- (car (list x2 y2)) (car (list x1 y1))))
  (setq yy (- (cadr (list x2 y2)) (cadr (list x1 y1))))
  (if ss
    (progn
      (setq bp (polar (list x1 y1)
                      (angle (list x1 y1) (list x2 y2))
                      (/ (distance (list x1 y1) (list x2 y2)) 2)
               )
      )
      (setq xx1 (getdist "\n指定新的X方向尺寸:"))
      (setq yy1 (getdist "\n指定新的Y方向尺寸:"))

      (setq xscal (/ xx1 xx))
      (setq yscal (/ yy1 yy))
      (MAKEUNBLOCK ss bp)
      (setq entL (entget (entLast))
            entL (subst
                   (cons 41 xscal)
                   (assoc 41 entL)
                   entL
                 )
            entL (subst
                   (cons 42 yscal)
                   (assoc 42 entL)
                   entL
                 )
      )
      (entmod entL)
      (command "_explode" "l")
    )
  )
  (princ)
)
发表于 2017-11-10 23:12 | 显示全部楼层
刚才试了一下,还不止是trans那么简单,得到的结论是,按要求几乎没办法。
问题的结症是entmake无名块,ent族函数得到的点几乎都是相对世界坐标系的,所有无名块不管在什么坐标系中entmake,实际上都还是相对于世界坐标系的,此时用户坐标系若相对于世界坐标系进行变换,比如旋转,那么用户坐标系中的xy比例变换,在世界坐标系中就不简单地是xy变换,而是一个向量在空间转换,不仅仅是组码41和42的问题了。
同样,vla-GetBoundingBox函数得到的包围盒,也是世界坐标系下的数值,在用户坐标系中进行变换也是个空间问题,不是简单比例的。
有点拗口。
知道问题所在,那么如果绕开entmake的思路,直接使用block命令做块(转换的事交给acad自己),或许能达到要求的效果,只是多了个块名,并且由于不能使用vla-GetBoundingBox函数,所以最终只能按比例缩放。
 楼主| 发表于 2017-11-11 08:43 | 显示全部楼层
ll_j 发表于 2017-11-10 23:12
刚才试了一下,还不止是trans那么简单,得到的结论是,按要求几乎没办法。
问题的结症是entmake无名块,en ...

那按照你的见解,这个程序在直接输入xy值得情况下,要想运用于所有视图,是不可能完成了是不
发表于 2017-11-11 21:52 | 显示全部楼层
ll_j 发表于 2017-11-10 23:12
刚才试了一下,还不止是trans那么简单,得到的结论是,按要求几乎没办法。
问题的结症是entmake无名块,en ...

你想得太复杂了。。。
 楼主| 发表于 2017-11-11 22:45 来自手机 | 显示全部楼层
xinxirong 发表于 2017-11-11 21:52
你想得太复杂了。。。

我也想想简单一点,可以是我不太懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 09:53 , Processed in 0.301265 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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