明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2057|回复: 14

烦恼的Z轴归零,到何时能完善?

[复制链接]
发表于 2023-4-24 18:29 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2023-4-24 19:12 编辑

这个问题,实在令人烦恼,随使用,修改,一步步的,有点想法,就忍不住的弄它,
因为这个问题,弄不好,它影响你工具箱的信誉。
以下代码,是我上午新改写一遍,集成测试下去再说.....

关于块内实体Z轴归零,这部分,还需要加以时日,本来想去除,


测试均在【三领设计】进行

链接:https://pan.baidu.com/s/1i_3njPLP5SPaouPfM_KmRA
提取码:0yp2

    • ;;Z坐标归零
    • (defun c:zzz0 ()
    •   (sl:tcqbjs) ;解锁所有图层
    •   (zzz0 (ssget))
    • )
    • ;;Z坐标归零-------【开始】----------
    • ;将弧的(210 0 0 -1)纠正为(210 0 0 1)而图形不变---(一级)-----
    • (defun _c210 (o / center mat za)
    •   (if (and
    •         (vlax-property-available-p o 'Normal)
    •         (setq za (safearray-value (vlax-variant-value (vla-get-normal o))))
    •         (equal (caddr za) -1 0.00001)
    •       )
    •     (progn
    •       (setq za '(0 0 1))
    •       (setq za (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble (cons 0 (1- (length za)))) za)))
    •       (vla-put-normal o za)
    •       ;;绕Y轴旋转 180度,旋转后组码210变了
    •       (setq Center (safearray-value (vlax-variant-value (vla-get-Center o))))
    •       (setq mat (mat:reflect (mapcar '+ '(0 1 0) Center) Center));平面镜向
    •       (setq mat (vlax-tmatrix mat))
    •       (vla-transformby o mat)
    •     )
    •   )
    • )
    • ;;二维镜像变换矩阵
    • ;;p1 镜像向量第一点
    • ;;p2 镜像向量第二点
    • (defun mat:reflect ( p1 p2 / a c s x y)
    •   (setq a (angle p1 p2) a (+ a a))
    •   (setq c (cos a) s (sin a))
    •   (setq x (car p1) y (cadr p1))
    •   (list
    •     (list c s  0. (- x (+ (* c x) (* s y))))
    •     (list s (- c) 0. (- y (- (* s x) (* c y))))
    •     '(0. 0. 1. 0.)
    •     '(0. 0. 0. 1.)
    •   )
    • )
    • ;;实体z坐标归零-----(一级)-------
    • (defun zero-ent (e / ent new tp)
    •   ;;块内实体归零e=嵌套块名------
    •   (defun blkzto0 (e / xblkname xblkdef e1)
    •     (if (= (vlax-property-available-p (en2obj e) "path") nil) ;;非参照块
    •       (progn
    •         (setq xblkname (dxf1 e 2))  ;;嵌套块名
    •         (setq xblkdef (tblobjname "Block" xblkname))
    •         (while (setq e1 (entnext xblkdef))
    •           (setq tp (dxf1 e1 0))  ;;子图元类型
    •           (if (= tp "INSERT")
    •             (blkzto0 e1)  ;;递归
    •             (progn
    •               (zero-ent e1)
    •               (vla-update (en2obj e1))
    •             )
    •           )
    •           (setq xblkdef e1)
    •         )
    •         (vla-update (en2obj e))
    •         (setq cb (1+ cb))
    •       )
    •     )
    •   )
    •   ;;将Z坐标更改为0
    •   (defun zeroz (key ent / oplist nplist k)
    •     (setq oplist (assoc key ent))
    •     (if (/= 0.0 (cadddr oplist))
    •       (progn
    •         (setq nplist (reverse (append '(0.0) (cdr (reverse oplist))))
    •           ent (subst nplist oplist ent)
    •         )
    •         (entmod ent)
    •         (setq k t)
    •       )
    •       (setq k nil)
    •     )
    •     k
    •   )
    •   ;;Region-------
    •   (defun move-region-to-wcs-plan (e / obj z)
    •     (setq obj (en2obj e))
    •     (if (and
    •           (= "AcDbRegion" (vla-get-objectname obj))
    •           (/= 0.0 (setq z (caddr (car (get-box e)))))
    •         )
    •       (progn
    •         (vla-move obj (vlax-3d-point (list 0 0 z)) (vlax-3d-point '(0 0 0)))
    •         (setq c10 (1+ c10))
    •       )
    •     )
    •   )
    •   ;;常规210组码处理(非弧、椭圆弧)----
    •   (defun correct210 (e / obj)
    •     (setq obj (en2obj e))
    •     (if (and
    •           (vlax-property-available-p obj 'normal t)
    •           (not (equal '(0 0 1) (vlax-safearray->list (vlax-variant-value (vla-get-normal obj)))))
    •         )
    •       (progn
    •         (vl-catch-all-apply 'vla-put-normal (list obj (vlax-3d-point '(0 0 1))))
    •         (setq c210 (1+ c210))
    •       )
    •     )
    •   )
    •   ;;实体内码归零----
    •   (defun zero-group (ent / kk a)
    •     ;;一般实体
    •     (foreach a ent
    •       (if (and
    •             (member (car a) '(10 11 12 13 14 15 16))
    •             (/= 0.0 (caddr a))
    •           )
    •         (progn
    •           (setq kk t)
    •           (subst (reverse (append '(0.0) (cdr (reverse a)))) a ent)
    •           (entmod ent)
    •         )
    •       )
    •     )
    •     (if (= kk t) (setq c10 (1+ c10)))
    •     ;;有38码的实体
    •     (if (/= (dxf1 ent 38) 0)
    •       (progn
    •         (entmod (emod ent 38 0))
    •         (setq c38 (1+ c38))
    •       )
    •     )
    •   )
    •   ;;主程序---------------
    •   (setq tp (dxf1 e 0) ent (entget e))
    •   (cond
    •     ((and (= tp "ARC") (equal (caddr (dxf1 ent 210)) -1 0.00001))
    •       (_c210 (en2obj e))
    •       (setq c210 (1+ c210))
    •     )
    •     ((not (member tp '("ELLIPSE" "ARC")))
    •       (correct210 e) ;;210组码强制转换
    •     )
    •     ((= tp "REGION")
    •       (move-region-to-wcs-plan e)
    •     )
    •     ((member tp '("INSERT"))
    •       (if (= (zeroz 10 ent) t)
    •         (setq c10 (1+ c10))
    •       )
    •       (blkzto0 e)
    •     )
    •     (t
    •       (setq new (mapcar 'zero-group ent))
    •       (if (not (equal ent new))
    •         (entmod new)
    •       )
    •     )
    •   )
    • )
    • ;;选择集归零-----(一级)----------
    • (defun zzz0 (ss / c10 c38 cb c210 nam i len)
    •   (setq len (sslength ss) i 0 c10 0 c38 0 cb 0 c210 0)
    •   (repeat len
    •     (setq nam (ssname ss i))
    •     (vl-catch-all-apply 'zero-ent (list nam))
    •     (setq i (1+ i))
    •   )
    •   (princ
    •     (strcat
    •       "\n 选择的 "
    •       (itoa len)
    •       " 个对象中 "
    •       (itoa c10)
    •       " 个非零Z坐标已清零->|| "
    •       (itoa c38)
    •       " 个标高被强制清零->|| "
    •       (itoa cb)
    •       " 个非参照块内实体已清零-> "
    •       (itoa c210)
    •       " 个210组码归正-> "
    •     )
    •   )
    • )
    • ;;Z坐标归零---【结束】-------
发表于 2023-4-27 08:14 | 显示全部楼层
画图不规范,亲人两行泪
回复 支持 1 反对 0

使用道具 举报

发表于 2023-6-30 18:08 | 显示全部楼层
本帖最后由 wang2006zhi 于 2023-6-30 18:10 编辑

发一个C#版本;基于开源项目IFOX库--具体可以百度
    [CommandMethod("W_ZZGL")]
    public void Z0()
    {
        using var tr = new DBTrans();
        if (Env.Editor.SelEnts<Entity>(out List<Entity> ents))
        {
            var ptt = new Point3d(0, 0, 1e99);
            var ptb = new Point3d(0, 0, -1e99);
            ents.ForEach(ent => {
                using (ent.ForWrite())
                {
                    ent.Move(Point3d.Origin, ptt);
                    ent.Move(ptt, ptb);
                    ent.Move(ptb, Point3d.Origin);
                }
            });
        }
    }
 楼主| 发表于 2023-4-24 19:44 | 显示全部楼层
本帖最后由 尘缘一生 于 2023-4-24 20:32 编辑
chixun99 发表于 2023-4-24 19:32
vba做了一个好像还行。不过不清楚lisp的怎么弄,我是通过把所有图元分类,一类直接改z坐标(标高)的,一类 ...

程序也是如此
应该分三大步
第一步:处理 210 38 370
第二步:处理组码唯一的比如15,16,就是你说的第一类
第三步:处理组码不唯一的点10 ,就是你说的遍历组码点位,第二类。
发表于 2023-4-24 19:32 | 显示全部楼层
vba做了一个好像还行。不过不清楚lisp的怎么弄,我是通过把所有图元分类,一类直接改z坐标(标高)的,一类需要遍历图形里的顶点,z坐标归零。块内图元好像也差不多吧。
发表于 2023-4-25 09:38 | 显示全部楼层
发表于 2023-4-25 10:20 | 显示全部楼层
本帖最后由 chixun99 于 2023-4-25 10:23 编辑
尘缘一生 发表于 2023-4-24 19:44
程序也是如此
应该分三大步
第一步:处理 210 38 370

没弄明白lisp,只是vba我做的自己用还行,基本都能归零改到位。当然我只是抽了部分常用的图元,不常用的那些基本就没去测试了,不全面。图块内部的相信也不是太难……
发表于 2023-4-25 10:22 | 显示全部楼层
lxl217114 发表于 2023-4-25 09:38
http://bbs.mjtd.com/thread-186637-1-1.html

lisp插件也有用贱人工具箱,不过这种转发的就没必要研究了。自己弄来可以作为其他功能的调用函数还是有意义的。起码自己有“马”,跑哪都快啊。
发表于 2023-4-25 12:32 | 显示全部楼层
chixun99 发表于 2023-4-25 10:22
lisp插件也有用贱人工具箱,不过这种转发的就没必要研究了。自己弄来可以作为其他功能的调用函数还是有意 ...

和贱人有啥关系?
听不懂你想要表达啥
发表于 2023-4-25 17:18 | 显示全部楼层
lxl217114 发表于 2023-4-25 12:32
和贱人有啥关系?
听不懂你想要表达啥

他应该说的是贱人工具箱有个Z轴归零的功能。一般的归零插件会存在一些问题;图元消失,块内图元不能归零,以块内图元为基点的操作都会导致z坐标不为零。当初一张图花了好久时间都没处理好,最后重绘也没有解决。
发表于 2023-4-26 09:19 | 显示全部楼层
谢谢分享,学习学习!
发表于 2023-4-26 23:10 | 显示全部楼层
块类的事情还是交给块去操作
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-4 05:07 , Processed in 0.235814 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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