找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1151|回复: 8

[转贴]:网上的"Z 轴归0 "

[复制链接]

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-10-1 12:08:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×

  1. ;;; FLATTEN.LSP version 2k.0, 25-May-1999
  2. ;;;
  3. ;;; FLATTEN sets the Z-coordinates of these types of objects to 0
  4. ;;; in the World Coordinate System:
  5. ;;;  "3DFACE" "ARC" "ATTDEF" "CIRCLE" "DIMENSION"
  6. ;;;  "ELLIPSE" "HATCH" "INSERT" "LINE" "LWPOLYLINE"
  7. ;;;  "MTEXT" "POINT" "POLYLINE" "SOLID" "TEXT"
  8. ;;;
  9. ;;;-----------------------------------------------------------------------
  10. ;;; copyright 1990-1999 by Mark Middlebrook
  11. ;;;   Daedalus Consulting
  12. ;;;   e-mail: [email]markmiddlebrook@compuserve.com[/email]
  13. ;;;
  14. ;;; Thanks to Vladimir Livshiz for improvements in polyline handling
  15. ;;; and the addition of several other object types.
  16. ;;;
  17. ;;; You are free to distribute FLATTEN.LSP to others so long as you do not
  18. ;;; charge for it.
  19. ;;;
  20. ;;;-----------------------------------------------------------------------
  21. ;;;*Why Use FLATTEN?
  22. ;;;
  23. ;;; FLATTENing is useful in at least two situations:
  24. ;;;  1) You receive a DXF file created by another CAD program and discover
  25. ;;;     that all the Z coordinates contain small round-off errors. These
  26. ;;;     round-off errors can prevent you from object snapping to
  27. ;;;     intersections and make your life difficult in other ways as well.
  28. ;;;  2) In a supposedly 2D drawing, you accidentally create one object with
  29. ;;;     a Z elevation and end up with a drawing containing objects partly
  30. ;;;     in and partly outside the Z=0 X-Y plane. As with the round-off
  31. ;;;     problem, this situation can make object snaps and other procedures
  32. ;;;     difficult.
  33. ;;;
  34. ;;; Warning: FLATTEN is not for flattening the custom objects created by
  35. ;;; applications such as Autodesk's Architectural Desktop. ADT and similar
  36. ;;; programs create "application-defined objects" that only the
  37. ;;; application really knows what to do with. FLATTEN has no idea how
  38. ;;; to handle application-defined objects, so it leaves them alone.
  39. ;;;
  40. ;;;-----------------------------------------------------------------------
  41. ;;;*How to Use FLATTEN
  42. ;;;
  43. ;;; This version of FLATTEN works with AutoCAD R12 through 2000.
  44. ;;;
  45. ;;; To run FLATTEN, load it using AutoCAD's APPLOAD command, or type:
  46. ;;;   (load "FLATTEN")
  47. ;;; at the AutoCAD command prompt. Once you've loaded FLATTEN.LSP, type:
  48. ;;;   FLATTEN
  49. ;;; to run it. FLATTEN will tell you what it's about to do and ask you
  50. ;;; to confirm that you really want to flatten objects in the current
  51. ;;; drawing. If you choose to proceed, FLATTEN prompts you to select objects
  52. ;;; to be flattened (press ENTER to flatten all objects in the drawing).
  53. ;;; After you've selected objects and pressed ENTER, FLATTEN goes to work.
  54. ;;; It reports the number of objects it flattens and the number left
  55. ;;; unflattenened (because they were objects not recognized by FLATTEN; see
  56. ;;; the list of supported objects above).
  57. ;;;
  58. ;;; If you don't like the results, just type U to undo FLATTEN's work.
  59. ;;;
  60. ;;;-----------------------------------------------------------------------
  61. ;;;*Known limitations
  62. ;;;  1) FLATTEN doesn't support all of AutoCAD's object types. See above
  63. ;;;     for a list of the object types that it does work on.
  64. ;;;  2) FLATTEN doesn't flatten objects nested inside of blocks.
  65. ;;;     (You can explode blocks before flattening. Alternatively, you can
  66. ;;;     WBLOCK block definitions to separate DWG files, run FLATTEN in
  67. ;;;     each of them, and then use INSERT in the parent drawing to update
  68. ;;;     the block definitions. Neither of these methods will flatten
  69. ;;;     existing attributes, though.
  70. ;;;  3) FLATTEN flattens objects onto the Z=0 X-Y plane in AutoCAD's
  71. ;;;     World Coordinate System (WCS). It doesn't currently support
  72. ;;;     flattening onto other UCS planes.
  73. ;;;
  74. ;;;=======================================================================

  75. (defun C:FLATTEN (/       olderr  oldcmd  zeroz   ss1     ss1len  i
  76.                   numchg  numnot  numno0  ssno0   ename   elist   etype
  77.                   yorn    vrt     crz
  78.                  )
  79.   ;;Error handler
  80.   (setq olderr *error*)
  81.   (defun *error* (msg)
  82.     (if (= msg "quit / exit abort")
  83.       (princ)
  84.       (princ (strcat "error: " msg))
  85.     )
  86.     (setq *error* olderr)
  87.     (command "._UCS"           "_Restore"        "$FLATTEN-TEMP$"
  88.              "._UCS"           "_Delete"         "$FLATTEN-TEMP$"
  89.             )
  90.     (command "._UNDO" "_End")
  91.     (setvar "CMDECHO" oldcmd)
  92.     (princ)
  93.   )

  94.   ;;Function to change Z coordinate to 0

  95.   (defun zeroz (key zelist / oplist nplist)
  96.     (setq oplist (assoc key zelist)
  97.           nplist (reverse (append '(0.0) (cdr (reverse oplist))))
  98.           zelist (subst nplist oplist zelist)
  99.     )
  100.     (entmod zelist)
  101.   )

  102.   ;;Setup
  103.   (setq oldcmd (getvar "CMDECHO"))
  104.   (setvar "CMDECHO" 0)
  105.   (command "._UNDO" "_Group")
  106.   (command "._UCS"         "_Delete"       "$FLATTEN-TEMP$"
  107.            "._UCS"         "_Save"         "$FLATTEN-TEMP$"
  108.            "._UCS"         "World"
  109.           )                             ;set World UCS

  110.   ;;Get input
  111.   (prompt
  112.     (strcat
  113.       "\nFLATTEN sets the Z coordinates of most objects to zero."
  114.     )
  115.   )

  116.   (initget "Yes No")
  117.   (setq yorn (getkword "\nDo you want to continue <Y>: "))
  118.   (cond ((/= yorn "No")
  119.          (graphscr)
  120.          (prompt "\nChoose objects to FLATTEN ")
  121.          (prompt
  122.            "[press return to select all objects in the drawing]"
  123.          )
  124.          (setq ss1 (ssget))
  125.          (if (null ss1)                 ;if enter...
  126.            (setq ss1 (ssget "X"))       ;select all entities in database
  127.          )


  128.          ;;*initialize variables
  129.          (setq ss1len (sslength ss1)    ;length of selection set
  130.                i      0                 ;loop counter
  131.                numchg 0                 ;number changed counter
  132.                numnot 0                 ;number not changed counter
  133.                numno0 0                 ;number not changed and Z /= 0 counter
  134.                ssno0  (ssadd)           ;selection set of unchanged entities
  135.          )                              ;setq

  136.          ;;*do the work
  137.          (prompt "\nWorking.")
  138.          (while (< i ss1len)            ;while more members in the SS
  139.            (if (= 0 (rem i 10))
  140.              (prompt ".")
  141.            )
  142.            (setq ename (ssname ss1 i)   ;entity name
  143.                  elist (entget ename)   ;entity data list
  144.                  etype (cdr (assoc 0 elist)) ;entity type
  145.            )

  146.            ;;*Keep track of entities not flattened
  147.            (if (not (member etype
  148.                             '("3DFACE"     "ARC"        "ATTDEF"
  149.                               "CIRCLE"     "DIMENSION"  "ELLIPSE"
  150.                               "HATCH"      "INSERT"     "LINE"
  151.                               "LWPOLYLINE" "MTEXT"      "POINT"
  152.                               "POLYLINE"   "SOLID"      "TEXT"
  153.                              )
  154.                     )
  155.                )
  156.              (progn                     ;leave others alone
  157.                (setq numnot (1+ numnot))
  158.                (if (/= 0.0 (car (reverse (assoc 10 elist))))
  159.                  (progn                 ;add it to special list if Z /= 0
  160.                    (setq numno0 (1+ numno0))
  161.                    (ssadd ename ssno0)
  162.                  )
  163.                )
  164.              )
  165.            )

  166.            ;;Change group 10 Z coordinate to 0 for listed entity types.
  167.            (if (member etype
  168.                        '("3DFACE"    "ARC"       "ATTDEF"    "CIRCLE"
  169.                          "DIMENSION" "ELLIPSE"   "HATCH"     "INSERT"
  170.                          "LINE"      "MTEXT"     "POINT"     "POLYLINE"
  171.                          "SOLID"     "TEXT"
  172.                         )
  173.                )
  174.              (setq elist  (zeroz 10 elist) ;change entities in list above
  175.                    numchg (1+ numchg)
  176.              )
  177.            )

  178.            ;;Change group 11 Z coordinate to 0 for listed entity types.
  179.            (if (member etype
  180.                        '("3DFACE" "ATTDEF" "DIMENSION" "LINE" "TEXT" "SOLID")
  181.                )
  182.              (setq elist (zeroz 11 elist))
  183.            )

  184.            ;;Change groups 12 and 13 Z coordinate to 0 for SOLIDs and 3DFACEs.
  185.            (if (member etype '("3DFACE" "SOLID"))
  186.              (progn
  187.                (setq elist (zeroz 12 elist))
  188.                (setq elist (zeroz 13 elist))
  189.              )
  190.            )

  191.            ;;Change groups 13, 14, 15, and 16
  192.            ;;Z coordinate to 0 for DIMENSIONs.
  193.            (if (member etype '("DIMENSION"))
  194.              (progn
  195.                (setq elist (zeroz 13 elist))
  196.                (setq elist (zeroz 14 elist))
  197.                (setq elist (zeroz 15 elist))
  198.                (setq elist (zeroz 16 elist))
  199.              )
  200.            )

  201.            ;;Change each polyline vertex Z coordinate to 0.
  202.            ;;Code provided by Vladimir Livshiz, 09-Oct-1998
  203.            (if (= etype "POLYLINE")
  204.              (progn
  205.                (setq vrt ename)
  206.                (while (not (equal (cdr (assoc 0 (entget vrt))) "SEQEND"))
  207.                  (setq elist (entget (entnext vrt)))
  208.                  (setq crz (cadddr (assoc 10 elist)))
  209.                  (if (/= crz 0)
  210.                    (progn
  211.                      (zeroz 10 elist)
  212.                      (entupd ename)
  213.                    )
  214.                  )
  215.                  (setq vrt (cdr (assoc -1 elist)))
  216.                )
  217.              )
  218.            )

  219.            ;;Special handling for LWPOLYLINEs
  220.            (if (member etype '("LWPOLYLINE"))
  221.              (progn
  222.                (setq elist  (subst (cons 38 0.0) (assoc 38 elist) elist)
  223.                      numchg (1+ numchg)
  224.                )
  225.                (entmod elist)
  226.              )
  227.            )

  228.            (setq i (1+ i))              ;next entity
  229.          )
  230.          (prompt " Done.")

  231.          ;;Print results
  232.          (prompt (strcat "\n" (itoa numchg) " object(s) flattened."))
  233.          (prompt
  234.            (strcat "\n" (itoa numnot) " object(s) not flattened.")
  235.          )

  236.          ;;If there any entities in ssno0, show them
  237.          (if (/= 0 numno0)
  238.            (progn
  239.              (prompt (strcat "  ["
  240.                              (itoa numno0)
  241.                              " with non-zero base points]"
  242.                      )
  243.              )
  244.              (getstring
  245.                "\nPress enter to see non-zero unchanged objects... "
  246.              )
  247.              (command "._SELECT" ssno0)
  248.              (getstring "\nPress enter to unhighlight them... ")
  249.              (command "")
  250.            )
  251.          )
  252.         )
  253.   )

  254.   (command "._UCS"           "_Restore"        "$FLATTEN-TEMP$"
  255.            "._UCS"           "_Delete"         "$FLATTEN-TEMP$"
  256.           )
  257.   (command "._UNDO" "_End")
  258.   (setvar "CMDECHO" oldcmd)
  259.   (setq *error* olderr)
  260.   (princ)
  261. )

  262. (prompt
  263.   "\nFLATTEN version 2k.0 loaded.  Type FLATTEN to run it."
  264. )
  265. (princ)

  266. ;;;eof
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-10-5 19:02:08 | 显示全部楼层
不错,我以前编过一个直线的z轴归0。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-10-7 23:52:48 | 显示全部楼层
该程序非常实用,谢谢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-10-22 10:38:55 | 显示全部楼层
不过没有对SPLINE的好像,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-10-26 21:42:57 | 显示全部楼层
用理正最方便了~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-11-25 20:25:21 | 显示全部楼层
;;标高(Z坐标)归零实用程序
(defun C:Z=0 ()
(setvar "cmdecho" 0)
(princ "\n正在处理图形数据,请稍候...")
(command "_.UCS" "")
(command "_.move" "_all" "" '(0 0 1e99) "" "_.move" "_p" "" '(0 0 -1e99) "")
(princ "\nOK,已将所有图元的标高值即Z坐标归零.")
(setvar "cmdecho" 1)
(princ)
);end (defun C:Z=0 ()
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-11-26 01:25:16 | 显示全部楼层
当很久以前我看到楼上贴的类似程序(也是用move 极限)的时候,我很诧异
编程的乐趣和奥妙尽在其中.这个程序居然用了cad的一个"bug",写出了最简短的 z 归 0 程序!
佩服第一个写出这个程序的人!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-11-26 01:30:08 | 显示全部楼层
各位,ET1.9里已经有flatten
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-1 20:20:24 | 显示全部楼层
让我大开眼界!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-26 21:02 , Processed in 0.193377 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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