明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 414|回复: 9

[提问] 求LISP程序:块中块Z坐标归零

[复制链接]
发表于 2023-11-13 10:10 | 显示全部楼层 |阅读模式
50明经币
本帖最后由 fengyu6913 于 2023-11-13 11:35 编辑

求LISP程序:块中块Z坐标归零
附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

查看完整内容

明经的巨大贡献 http://bbs.mjtd.com/forum.php?mo ... hlight=%D5%B9%C6%BD 第三个文件也一样能处理,还是用这个程序
发表于 2023-11-13 10:10 | 显示全部楼层
本帖最后由 panliang9 于 2023-11-15 08:51 编辑

明经的巨大贡献
http://bbs.mjtd.com/forum.php?mo ... hlight=%D5%B9%C6%BD

第三个文件也一样能处理,还是用这个程序





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

发表于 2023-11-13 17:21 | 显示全部楼层
本帖最后由 yaojing38 于 2023-11-13 17:31 编辑
  1. ;;;**************Z坐标归零 程序开始**************
  2. (defun c:zzz ()
  3.   (setvar "osmode" 15359)
  4.   (setvar "cmdecho" 0)
  5.   (princ "\n★功能:将所有对象的Z坐标归零.")
  6.   (command "_.UCS" "")
  7.   (command "_.move"
  8.      "_all"
  9.      ""
  10.      '(0
  11.        0
  12.        1e305
  13.       )
  14.      ""
  15.      "_.move"
  16.      "_p"
  17.      ""
  18.      '(0
  19.        0
  20.        -1e305
  21.       )
  22.      ""
  23.   )
  24.   (princ "\n提示:已将图形中所有对象的Z坐标归零.")
  25.   (princ)
  26. )
  27. ;;;**************Z坐标归零 程序结束**************
  28. ;;;**************Z坐标归零 程序开始**************
  29. (defun c:zzz0 (/ s)
  30.   (setvar "osmode" 15359)
  31.   (setvar "cmdecho" 0)
  32.   (princ "\n★功能:将所选对象的Z坐标归零.")
  33.   (command "_.UCS" "")
  34.   (if (setq s (ssget))
  35.     (command "_.move" s "" '(0 0 1e305) "" "_.move" "_p" "" '(0 0 -1e305) "")
  36.   )
  37.   (princ "\n提示:已将所选对象的Z坐标归零.")
  38.   (princ)
  39. )
  40. ;;;**************Z坐标归零 程序结束**************

;以下均为论坛大佬代码,,建议你先搜搜在发问题
回复

使用道具 举报

 楼主| 发表于 2023-11-15 00:04 | 显示全部楼层
yaojing38 发表于 2023-11-13 17:21
;以下均为论坛大佬代码,,建议你先搜搜在发问题

经验证此方法不能使块中块不归零图元归零
回复

使用道具 举报

发表于 2023-11-18 15:45 | 显示全部楼层
(defun c:z0()
        (setq cmdecho (getvar "cmdecho"))
        (setvar "cmdecho" 0)
(alert "

                 注意!!!!!!!!!!!

   本程序用于将图中所有线、物的 Z 值变为 零 !

========================================================


                                                             ")
               (setq ssgcd (ssget "X" ))
          (if ssgcd
                (progn
                    (setq n (sslength ssgcd) n0 0)
                    (repeat n
                        (setq ssi (ssname ssgcd n0))
                        (command "change"  ssi "" "p" "e" "0" "")
                        (setq n0 (+ n0 1))
                    )
                )
        )
)
回复

使用道具 举报

 楼主| 发表于 2023-11-19 16:26 | 显示全部楼层
panliang9 发表于 2023-11-15 08:28
明经的巨大贡献
http://bbs.mjtd.com/forum.php?mo ... hlight=%D5%B9%C6%BD

感谢大佬分享,这个能解决绝大部分块中块归零问题
回复

使用道具 举报

 楼主| 发表于 2023-11-19 16:29 | 显示全部楼层
弥勒 发表于 2023-11-18 15:45
(defun c:z0()
        (setq cmdecho (getvar "cmdecho"))
        (setvar "cmdecho" 0)

感谢大佬分享,经测试这个只能解决块外面的图元不归零
回复

使用道具 举报

发表于 2023-12-1 23:47 | 显示全部楼层
本帖最后由 KO你 于 2023-12-2 00:02 编辑

快捷键  z00  选择对象Z轴归零
(defun c:z00 (/ ss)
(setvar "cmdecho" 0)
(if (setq ss (ssget))
(command ".MOVE" ss "" "0,0,0" "0,0,1000e99" ".MOVE" "P" "" "0,0,1000e99" "0,0,0"))
(princ "\n已将选择的图元标高值归零.")
(princ))

快捷键  z0  Z轴归零
(vl-load-com)

(defun getboundingbox (ename / lb ur)
  (vla-getboundingbox
    (vlax-ename->vla-object ename)
    'lb
    'ur
  )
  (mapcar 'vlax-safearray->list (list lb ur))
)
;;


(defun move-region-to-wcs-plan (ename / obj z)
  (setq obj (vlax-ename->vla-object ename))
  (if (and
  (= "AcDbRegion" (vla-get-objectname obj))
  (/= 0.0 (setq z (caddr (car (getboundingbox ename)))))
      )
    (vla-move obj
        (vlax-3d-point (list 0 0 z))
        (vlax-3d-point (list 0 0 0))
    )
  )
)
;; (move-region-to-wcs-plan(car(entsel)))


;; <a href="http://bbs.mjtd.com/thread-93123-1-1.html" target="_blank">http://bbs.mjtd.com/thread-93123-1-1.html</a>
(defun correct210 (ent / obj za)
  (setq obj (vlax-ename->vla-object ent))
  (if (and (vlax-property-available-p obj 'normal t)
     (not  (equal '(0 0 1)
           (setq za  (vlax-safearray->list
          (vlax-variant-value (vla-get-normal obj))
        )
           )
    )
     )
      )
    (vl-catch-all-apply 'vla-put-normal (list obj (vlax-3d-point '(0 0 1))))
;;;    (progn
;;;      (setq za (vlax-safearray->list
;;;     (vlax-variant-value (vla-get-normal obj))
;;;         )
;;;      )
;;;      (vla-transformby
;;;  obj
;;;  (vlax-tmatrix
;;;    (list
;;;      (list 1 0 (car za) 0)
;;;      (list 0 1 (cadr za) 0)
;;;      (list 0 0 (caddr za) 0)
;;;      (list 0 0 0 1)
;;;    )
;;;  )
;;;      )
;;;    )
  )
)
;;

(defun zero-group (e)
  (cond
    ;; 处理 10-14 段,含 Z 坐标且非零组码,设置Z = 0.0
    ((and (>= (car e) 10)
    (<= (car e) 14)
    (> (length e) 3)
    (/= 0.0 (nth 3 e))
     )
     (setq c10 (1+ c10))
     (cons (car e) (list (cadr e) (caddr e) 0.0))
    )

    ;; 处理 38 段(标高属性)
    ((and (= (car e) 38) (/= 0.0 (cdr e)))
     (setq c38 (1+ c38))
     '(38 . 0.0)
    )

    ;; 其余组码原样返回
    (t e)
  )
)

(defun zero-ent  (e / dxf new)
  ;;(correct210 e)

  (setq dxf (entget e))

  (if (= (cdr (assoc 0 dxf)) "REGION")
    (move-region-to-wcs-plan e)

    (progn
      (setq new (mapcar 'zero-group dxf))
      (if (not (equal dxf new))
  (entmod new)
      )
    )
  )
  new
)

(defun zero-block (/)
  (vlax-for block (vla-get-blocks
        (vla-get-activedocument (vlax-get-acad-object))
      )
    (vlax-for e  block
      (zero-ent (vlax-vla-object->ename e))
    )
  )
)


(defun c:z0 (/ c10 c38 dxf ent i len ss)
  (princ "选择需要将Z坐标或标高属性清零的对象 <回车选择所有图元>: ")
  
  (setq ss (ssget))
  (if (null ss)
    (setq ss (ssget "_X"))
  )
  (if (null ss)
    (progn (princ "\n选择集空")
     (quit)
    )
  )

  (setq  len (sslength ss)
  i   0
  c10 0
  c38 0
  )

  (vla-startundomark
    (vla-get-activedocument (vlax-get-acad-object))
  )

  ;; 块定义内实体归零
  (zero-block)

  (repeat len

    (zero-ent (setq ent (ssname ss i)))

;;;      ((wcmatch (cdr (assoc 0 dxf)) "INSERT,POLYLINE")
;;;       (setq ent (entnext ent))
;;;      
;;;       (while (and ent
;;;       (setq et (cdr (assoc 0 (setq dxf (entget ent)))))
;;;       (= et "ATTDEF")
;;;       (/= et "SEQEND")
;;;        )
;;;   (zero-ent ent)
;;;   (setq ent (entnext ent))
;;;       )
;;;      )
    (setq i (1+ i))
  )


  (vla-endundomark
    (vla-get-activedocument (vlax-get-acad-object))
  )

  (command "_.regen")

  (princ (strcat "选择的 "
     (itoa len)
     " 个对象中,\n"
     (itoa c10)
     " 个非零Z坐标, "
     (itoa c38)
     " 个标高属性被强制清零."
   )
  )
(princ))





快捷键  qz  三维转二维
(defun c:qz () (c:flatten))
(defun c:flatten ( / ss ans )
(acet-error-init (list nil 1))

(princ "\n选择要转换为二维的对象...")
(if (not acet:flatn-hide)
     (setq acet:flatn-hide "No")
);if

(if (and (setq ss (ssget "_:l" '((-4 . "<NOT") (0 . "VIEWPORT") (-4 . "NOT>"))));setq
          (setq ss (car (acet-ss-filter (list ss nil T))))
     );and
     (progn
      (initget "Yes No")
      (setq ans (getkword
                 (acet-str-format "\n删除隐藏线? <%1>: "
                                  acet:flatn-hide
                 )
                );getkword
      );setq
      (if (not ans)
          (setq ans acet:flatn-hide)
          (setq acet:flatn-hide ans)
      );if
      (if (equal ans "No")
          (acet-flatn ss nil)
          (acet-flatn ss T)
      );if
     );progn then
);if
(acet-error-restore)
);defun c:flatten


(acet-autoload2        '("FLATTENSUP.LSP"        (acet-flatn ss hide)))
(princ)

点评

报错,语法错误。  发表于 2023-12-14 12:30
回复

使用道具 举报

发表于 2023-12-2 00:03 | 显示全部楼层
配合这三个程序,你上面几个文件我都下载试过,可以处理
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 07:36 , Processed in 0.303132 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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