Re: [問題]如何將 autocad 檔案中,不同Z高程的線갠…

看板Cad_Cae (電腦輔助設計)作者 (心中日月)時間17年前 (2008/06/22 03:04), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串6/7 (看更多)
恕我無知 但這篇我完全看不懂 請問到底要怎麼解決呢 請教各位高手 ※ 引述《sjgau (sjgau)》之銘言: : 我自己寫的版本,寫到一半 : 想說,不可能寫到完整 : 就上網抓一個 別人寫好的, : 非常完整的版本 : 請大家欣賞,如下 : ;;; FLATTEN.LSP version 2k.01f, 14-Jul-2000 : ;;; : ;;; FLATTEN sets the Z-coordinates of these types of objects to 0 : ;;; in the World Coordinate System: : ;;; "3DFACE" "ARC" "ATTDEF" "CIRCLE" "DIMENSION" : ;;; "ELLIPSE" "HATCH" "INSERT" "LINE" "LWPOLYLINE" : ;;; "MTEXT" "POINT" "POLYLINE" "SOLID" "TEXT" : ;;; : ;;;----------------------------------------------------------------------- : ;;; copyright 1990-2000 by Mark Middlebrook : ;;; Daedalus Consulting : ;;; e-mail: mark@markcad.com : ;;; : ;;; Before you e-mail me with support questions, please make sure that : ;;; you're using the current version. You can download it from : ;;; http://markcad.com. : ;;; : ;;; This program is free software. You can redistribute it and/or modify : ;;; it under the terms of the GNU General Public License as published by : ;;; the Free Software Foundation: http://www.gnu.org/copyleft/gpl.html. : ;;; : ;;; Thanks to Vladimir Livshiz for improvements in polyline handling : ;;; and the addition of several other object types. : ;;; : ;;;----------------------------------------------------------------------- : ;;; Revision history : ;;; v. 2k.0 25-May-1999 First release for AutoCAD 2000. : ;;; v. 2k.01 25-Jun-1999 Fixed two globalization bugs ("_World" & "_X") : ;;; and revised error handler. : ;;; v. 2k.01f 14-Jul-1999 Added GNU GPL and download info to header. : ;;; : ;;;----------------------------------------------------------------------- : ;;;*Why Use FLATTEN? : ;;; : ;;; FLATTENing is useful in at least two situations: : ;;; 1) You receive a DXF file created by another CAD program and discover : ;;; that all the Z coordinates contain small round-off errors. These : ;;; round-off errors can prevent you from object snapping to : ;;; intersections and make your life difficult in other ways as well. : ;;; 2) In a supposedly 2D drawing, you accidentally create one object with : ;;; a Z elevation and end up with a drawing containing objects partly : ;;; in and partly outside the Z=0 X-Y plane. As with the round-off : ;;; problem, this situation can make object snaps and other procedures : ;;; difficult. : ;;; : ;;; Warning: FLATTEN is not for flattening the custom objects created by : ;;; applications such as Autodesk's Architectural Desktop. ADT and similar : ;;; programs create "application-defined objects" that only the : ;;; application really knows what to do with. FLATTEN has no idea how : ;;; to handle application-defined objects, so it leaves them alone. : ;;; : ;;;----------------------------------------------------------------------- : ;;;*How to Use FLATTEN : ;;; : ;;; This version of FLATTEN works with AutoCAD R12 through 2000. : ;;; : ;;; To run FLATTEN, load it using AutoCAD's APPLOAD command, or type: : ;;; (load "FLATTEN") : ;;; at the AutoCAD command prompt. Once you've loaded FLATTEN.LSP, type: : ;;; FLATTEN : ;;; to run it. FLATTEN will tell you what it's about to do and ask you : ;;; to confirm that you really want to flatten objects in the current : ;;; drawing. If you choose to proceed, FLATTEN prompts you to select objects : ;;; to be flattened (press ENTER to flatten all objects in the drawing). : ;;; After you've selected objects and pressed ENTER, FLATTEN goes to work. : ;;; It reports the number of objects it flattens and the number left : ;;; unflattenened (because they were objects not recognized by FLATTEN; see : ;;; the list of supported objects above). : ;;; : ;;; If you don't like the results, just type U to undo FLATTEN's work. : ;;; : ;;;----------------------------------------------------------------------- : ;;;*Known limitations : ;;; 1) FLATTEN doesn't support all of AutoCAD's object types. See above : ;;; for a list of the object types that it does work on. : ;;; 2) FLATTEN doesn't flatten objects nested inside of blocks. : ;;; (You can explode blocks before flattening. Alternatively, you can : ;;; WBLOCK block definitions to separate DWG files, run FLATTEN in : ;;; each of them, and then use INSERT in the parent drawing to update : ;;; the block definitions. Neither of these methods will flatten : ;;; existing attributes, though. : ;;; 3) FLATTEN flattens objects onto the Z=0 X-Y plane in AutoCAD's : ;;; World Coordinate System (WCS). It doesn't currently support : ;;; flattening onto other UCS planes. : ;;; : ;;;======================================================================= : (defun C:FLATTEN (/ 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") : ;set World UCS : ;;Get input : (prompt : (strcat : "\nFLATTEN sets the Z coordinates of most objects to zero." : ) : ) : (initget "Yes No") : (setq yorn (getkword "\nDo you want to continue <Y>: ")) : (cond ((/= yorn "No") : (graphscr) : (prompt "\nChoose objects to FLATTEN ") : (prompt : "[press return to select all objects in the drawing]" : ) : (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 : ) : (prompt " Done.") : ;;Print results : (prompt (strcat "\n" (itoa numchg) " object(s) flattened.")) : (prompt : (strcat "\n" (itoa numnot) " object(s) not flattened.") : ) : ;;If there any entities in ssno0, show them : (if (/= 0 numno0) : (progn : (prompt (strcat " [" : (itoa numno0) : " with non-zero base points]" : ) : ) : (getstring : "\nPress enter to see non-zero unchanged objects... " : ) : (command "._SELECT" ssno0) : (getstring "\nPress enter to unhighlight them... ") : (command "") : ) : ) : ) : ) : (command "._UCS" "_Restore" tmpucs "._UCS" "_Delete" tmpucs) : (command "._UNDO" "_End") : (setvar "CMDECHO" oldcmd) : (setq *error* olderr) : (princ) : ) : (prompt : "\nFLATTEN version 2k.01f loaded. Type FLATTEN to run it." : ) : (princ) : ;;;eof : ※ 引述《sjgau (sjgau)》之銘言: : : 這個問題,已經處理完畢 : : 就是 寫一個 LISP 程式去處理每一個物件 : : 把 z- 座標設定成 0.0 : : 有興趣想要了解 參考這個 LISP 程式的朋友, : : 可以 使用外面的 e-mail 跟我 求檔 : : 我的 外面的 e-mail: sjgau4311@gmail.com : : 程式不大,303行 : : 有詳細的注解的 原始程式碼 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.224.48.119
文章代碼(AID): #18NL399h (Cad_Cae)
討論串 (同標題文章)
文章代碼(AID): #18NL399h (Cad_Cae)