烦恼的Z轴归零,到何时能完善?
本帖最后由 尘缘一生 于 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 s0. (- 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坐标归零---【结束】-------
画图不规范,亲人两行泪 本帖最后由 wang2006zhi 于 2023-6-30 18:10 编辑
发一个C#版本;基于开源项目IFOX库--具体可以百度
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);
}
});
}
} 每个人画图的时候,或者拿到别人画的图又或者其他软件画的图不一样,甚至是各个行业不同,自然有不同的工况……觉得做成“Z值归零”一个函数→用来应对“连接直线与多段线”→不同标高或者Z值时→需要手动调整后再执行连接命令的情况→以最快速度统一归一个具体值→再执行连接功能→会比较快捷!
比如 (zzz0 (ssget) 0)或(zzz0 (ssget) n)输入0就是归零,输入n就是指定n值!这样插入线连接或者传递高程(标高)的插件代码时,先归于同一个高程(标高)再执行连接线段功能,那就快捷很多了…… vba做了一个好像还行。不过不清楚lisp的怎么弄,我是通过把所有图元分类,一类直接改z坐标(标高)的,一类需要遍历图形里的顶点,z坐标归零。块内图元好像也差不多吧。 本帖最后由 尘缘一生 于 2023-4-24 20:32 编辑
chixun99 发表于 2023-4-24 19:32
vba做了一个好像还行。不过不清楚lisp的怎么弄,我是通过把所有图元分类,一类直接改z坐标(标高)的,一类 ...
程序也是如此
应该分三大步
第一步:处理 210 38 370
第二步:处理组码唯一的比如15,16,就是你说的第一类
第三步:处理组码不唯一的点10 ,就是你说的遍历组码点位,第二类。
http://bbs.mjtd.com/thread-186637-1-1.html 本帖最后由 chixun99 于 2023-4-25 10:23 编辑
尘缘一生 发表于 2023-4-24 19:44
程序也是如此
应该分三大步
第一步:处理 210 38 370
没弄明白lisp,只是vba我做的自己用还行,基本都能归零改到位。当然我只是抽了部分常用的图元,不常用的那些基本就没去测试了,不全面。图块内部的相信也不是太难…… lxl217114 发表于 2023-4-25 09:38
http://bbs.mjtd.com/thread-186637-1-1.html
lisp插件也有用贱人工具箱,不过这种转发的就没必要研究了。自己弄来可以作为其他功能的调用函数还是有意义的。起码自己有“马”,跑哪都快啊。 chixun99 发表于 2023-4-25 10:22
lisp插件也有用贱人工具箱,不过这种转发的就没必要研究了。自己弄来可以作为其他功能的调用函数还是有意 ...
和贱人有啥关系?
听不懂你想要表达啥 lxl217114 发表于 2023-4-25 12:32
和贱人有啥关系?
听不懂你想要表达啥
他应该说的是贱人工具箱有个Z轴归零的功能。一般的归零插件会存在一些问题;图元消失,块内图元不能归零,以块内图元为基点的操作都会导致z坐标不为零。当初一张图花了好久时间都没处理好,最后重绘也没有解决。 谢谢分享,学习学习! 块类的事情还是交给块去操作
页:
[1]
2