明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2413|回复: 2

[源码] 使用高山流水的“Z轴归零”后,发现一些问题

[复制链接]
发表于 2010-12-21 01:12 | 显示全部楼层 |阅读模式
运行中提示 : 未知命令"ZZGL"
然后所有的图元的Z坐标都成了 -1.00E+99
实在没时间修改程序
就手动把所有图元的Z坐标改成了 0
然后
每回重新打开这张图第一次zoom e的时候
就会弹出ACAD的警告窗口“准备重生成--是否继续?”
如果不点取消下次zoom e时还会弹出来
这个窗口该怎么让它不再弹出来?

另附源码
哪位有空改一下

;;;Z轴归零
(defun C:ZZGL (/       ss      tmpucs  olderr  oldcmd  zeroz   ss1
        ss1len  i       numchg  numnot  numno0  ssno0   ename
        elist   etype   yorn    vrt     crz
       )
  (setq tmpucs "$FLATTEN-TEMP$") ;temporary UCS
  ;;Error handler
  (setq olderr *error*)
  (defun *error* (msg)
    (if (or
   (= msg "Function cancelled")
   (= msg "quit / exit abort")
)
      ;;if user cancelled or program aborted, exit quietly
      (princ)
      ;;otherwise report error message
      (princ (strcat "\nError: " msg))
    )
    (setq *error* olderr)
    (if (tblsearch "UCS" tmpucs)
      (command "._UCS" "_Restore" tmpucs "._UCS" "_Delete" tmpucs)
    )
    (command "._UNDO" "_End")
    (setvar "CMDECHO" oldcmd)
    (princ)
  )
  ;;Function to change Z coordinate to 0
  (defun zeroz (key zelist / oplist nplist)
    (setq oplist (assoc key zelist)
   nplist (reverse (append '(0.0) (cdr (reverse oplist))))
   zelist (subst nplist oplist zelist)
    )
    (entmod zelist)
  )
  ;;Setup
  (setq oldcmd (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)
  (command "._UNDO" "_Group")
  (command "._UCS" "_Delete" tmpucs "._UCS" "_Save" tmpucs "._UCS"
    "_World")
  ;;Get input      
  (setq ss1 (ssget))
  (if (null ss1)   ;if enter...
    (setq ss1 (ssget "_X"))  ;select all entities in database
  )
  ;;*initialize variables
  (setq ss1len (sslength ss1)  ;length of selection set
i      0   ;loop counter
numchg 0   ;number changed counter
numnot 0   ;number not changed counter
numno0 0   ;number not changed and Z /= 0 counter
ssno0  (ssadd)   ;selection set of unchanged entities
  )     ;setq
  ;;*do the work
  (prompt "\nWorking.")
  (while (< i ss1len)   ;while more members in the SS
    (if (= 0 (rem i 10))
      (prompt ".")
    )
    (setq ename (ssname ss1 i)  ;entity name
   elist (entget ename)  ;entity data list
   etype (cdr (assoc 0 elist)) ;entity type
    )
    ;;*Keep track of entities not flattened
    (if (not (member etype
       '("3DFACE"     "ARC"  "ATTDEF"
         "CIRCLE"     "DIMENSION"  "ELLIPSE"
         "HATCH"     "INSERT"  "LINE"
         "LWPOLYLINE" "MTEXT"  "POINT"
         "POLYLINE"   "SOLID"  "TEXT"
        )
      )
)
      (progn    ;leave others alone
(setq numnot (1+ numnot))
(if (/= 0.0 (car (reverse (assoc 10 elist))))
   (progn   ;add it to special list if Z /= 0
     (setq numno0 (1+ numno0))
     (ssadd ename ssno0)
   )
)
      )
    )
    ;;Change group 10 Z coordinate to 0 for listed entity types.
    (if (member etype
  '("3DFACE"    "ARC"   "ATTDEF"    "CIRCLE"
    "DIMENSION" "ELLIPSE"   "HATCH"     "INSERT"
    "LINE"      "MTEXT"   "POINT"     "POLYLINE"
    "SOLID"     "TEXT"
   )
)
      (setq elist  (zeroz 10 elist) ;change entities in list above
     numchg (1+ numchg)
      )
    )
    ;;Change group 11 Z coordinate to 0 for listed entity types.
    (if (member etype
  '("3DFACE" "ATTDEF" "DIMENSION" "LINE" "TEXT" "SOLID")
)
      (setq elist (zeroz 11 elist))
    )
    ;;Change groups 12 and 13 Z coordinate to 0 for SOLIDs and 3DFACEs.
    (if (member etype '("3DFACE" "SOLID"))
      (progn
(setq elist (zeroz 12 elist))
(setq elist (zeroz 13 elist))
      )
    )
    ;;Change groups 13, 14, 15, and 16
    ;;Z coordinate to 0 for DIMENSIONs.
    (if (member etype '("DIMENSION"))
      (progn
(setq elist (zeroz 13 elist))
(setq elist (zeroz 14 elist))
(setq elist (zeroz 15 elist))
(setq elist (zeroz 16 elist))
      )
    )
    ;;Change each polyline vertex Z coordinate to 0.
    ;;Code provided by Vladimir Livshiz, 09-Oct-1998
    (if (= etype "POLYLINE")
      (progn
(setq vrt ename)
(while (not (equal (cdr (assoc 0 (entget vrt))) "SEQEND"))
   (setq elist (entget (entnext vrt)))
   (setq crz (cadddr (assoc 10 elist)))
   (if (/= crz 0)
     (progn
       (zeroz 10 elist)
       (entupd ename)
     )
   )
   (setq vrt (cdr (assoc -1 elist)))
)
      )
    )
    ;;Special handling for LWPOLYLINEs
    (if (member etype '("LWPOLYLINE"))
      (progn
(setq elist  (subst (cons 38 0.0) (assoc 38 elist) elist)
       numchg (1+ numchg)
)
(entmod elist)
      )
    )
    (setq i (1+ i))   ;next entity
  )
  ;;Print results
  (prompt (strcat "\n" (itoa numchg) " AutoCAD实体归零."))
  (prompt
    (strcat "\n" (itoa numnot) " 个非AutoCad实体未归零.")
  )
  (princ "\n二次归零...")  
  (if ssno0
    (progn
      (setvar "cmdecho" 0)
      (princ "\n正在处理图形数据,请稍候...")
      (terpri)
      (command ".ucs" "w")
      (command ".move" ssno0 "" '(0 0 1e99) "" ".move" "p" "" '(0 0 -1e99) "")
      (princ "\n已将所选图元Z坐标值全部归零")      
    )   
  )
  ;;If there any entities in ssno0, show them
  (command "._UCS" "_Restore" tmpucs "._UCS" "_Delete" tmpucs)
  (command "._UNDO" "_End")
  (setvar "CMDECHO" oldcmd)
  (setq *error* olderr)   
  (princ "\n高山流水Z轴归零程序,命令ZZGL")
)

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2010-12-21 07:07 | 显示全部楼层
请问楼上是否想归零,如果是的话,不必那样,用CHANGE就行了......
 楼主| 发表于 2010-12-23 00:28 | 显示全部楼层
change命令无法修改具有不同 Z 坐标的对象的标高

别人的提资图里的图元具有不同的标高
开始没有注意
画了一半发现有些图线无法剪切延伸或打断
所以才需要把所有图元统一为Z=0
结果用的程序有bug
手工改为z=0后又出现顶贴所说的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-16 09:44 , Processed in 0.140255 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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