XIJIANGWOO 发表于 2022-7-6 01:35:08

修改“LinExp”lisp

linexp。艾斯费罗各位,
 
我想使用我在论坛中找到的LinExp lisp,但我想知道如何修改它,这样用户就不必选择对象,只需分解所有“行”,而不分解其他对象。分解不同形状的对象时,lisp不准确。我知道必须使用过滤器,但我不知道该如何开始或从哪里开始。这是很容易做到的吗?我不懂autolisp。我只是其他语言的新手。非常感谢您的帮助。
 
非常感谢。

BIGAL 发表于 2022-7-6 01:41:37

你不能爆炸线!这是一个最简单的元素,和圆、弧、文本一样,你可以分解柱脚、多行文字块以及更多。
 
你能解释一下你想做什么吗。

eldon 发表于 2022-7-6 01:41:46

我想你会发现线是可以分解的。
 
附加的lisp是TEXTEXP的一个改编,它基本上导出WMF图像,然后将图像作为多段线重新导入。它不是非常精确(比例略不是1),线宽变为0。
 
但是如果OP想要进一步调整它,现在是学习Lisp的好机会。

XIJIANGWOO 发表于 2022-7-6 01:45:18

谢谢你的回复。我正在努力学习Lisp程序。我只是认为可以修改linexp lisp以分解所有行,而不是让用户选择每一行。

David Bethel 发表于 2022-7-6 01:48:10

 
我认为我必须同意比格尔的观点。
 
lisp文件没有附加,但看看什么可以被视为分解线实体会很有趣-大卫

eldon 发表于 2022-7-6 01:52:25

 
我在发布之前确实试过了,所以对于我的设置,我可以分解所有行。无论我是否愿意走到OP看起来的那么远,我都不会。
 
连续线“分解”为零线宽的多段线。非连续线型“分解”为单个多段线。
 
这是发布的lisp代码
 
;;
;;;
;;;    By Dominic Panholzer
;;;
;;;    Modified original TXTEXP.LSP from Express Tools
;;;    Copyright © 1999 by Autodesk, Inc.
;;   LINEXP.LSP modifications by XANADU
;;;
;;;    Your use of this software is governed by the terms and conditions of the
;;;    License Agreement you accepted prior to installation of this software.
;;;    Please note that pursuant to the License Agreement for this software,
;;;    "opying of this computer program or its documentation except as
;;;    permitted by this License is copyright infringement under the laws of
;;;    your country.If you copy this computer program without permission of
;;;    Autodesk, you are violating the law."
;;;
;;;    AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
;;;    AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
;;;    MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE.AUTODESK, INC.
;;;    DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
;;;    UNINTERRUPTED OR ERROR FREE.
;;;
;;;    Use, duplication, or disclosure by the U.S. Government is subject to
;;;    restrictions set forth in FAR 52.227-19 (Commercial Computer
;;;    Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
;;;    (Rights in Technical Data and Computer Software), as applicable.
;;;
;;;----------------------------------------------------------------
;;;
;;;External Functions:
;;;
;;;   ACET-ERROR-INIT         --> ACETUTIL.FAS   Intializes bonus error routine
;;;   ACET-ERROR-RESTORE      --> ACETUTIL.FAS   Restores old error routine
;;;   ACET-GEOM-ZOOM-FOR-SELECT --> ACETUTIL.FAS   Zoom boundry to include points given
;;;   ACET-LAYER-LOCKED         --> ACETUTIL.FAS   Checks to see if layer is locked
;;;   ACET-GEOM-PIXEL-UNIT      --> ACETUTIL.FAS   Size of pixel in drawing units
;;;   ACET-GEOM-TEXTBOX         --> ACETUTIL.FAS   Returns the textbox for any text
;;;   ACET-GEOM-MIDPOINT      --> ACETUTIL.FAS   Returns midpoint between two points
;;;   ACET-GEOM-VIEW-POINTS   --> ACETUTIL.FAS   Returns corner points of screen or viewport
;;;   ACET-STR-FORMAT         --> ACETUTIL.ARX   String builder
;;;   ACET-WMFIN                --> ACETUTIL.FAS   Brings in WMF file
;;;

(defun c:linexp (/ grplst getgname blknm FLTR GLST GDICT SS VIEW UPLFT TMPFIL TBX
                  TMPFIL CNT PT1 PT2 ENT TXT TXTYP PTLST ZM LOCKED GNAM vpna vplocked)
(acet-error-init
       (list
      (list   "cmdecho" 0
                "highlight" 1
                "osmode" 0
                "Mirrtext" 1
                "limcheck" 0
      )
      T
       )
)

; --------------------- GROUP LIST FUNCTION ----------------------
;   This function will return a list of all the group names in the
;   drawing and their entity names in the form:
;   ((<ename1> . <name1>) ... (<enamex> . <namex>))
; ----------------------------------------------------------------

(defun acet-txtexp-grplst (/ GRP ITM NAM ENT GLST)

   (setq GRP(dictsearch (namedobjdict) "ACAD_GROUP"))
   (while (setq ITM (car GRP))       ; While edata item is available
   (if (= (car ITM) 3)             ; if the item is a group name
       (setq NAM (cdr ITM)         ; get the name
             GRP (cdr GRP)         ; shorten the edata
             ITM (car GRP)         ; get the next item
             ENT (cdr ITM)         ; which is the ename
             GRP (cdr GRP)         ; shorten the edata
             GLST                  ; store the ename and name
               (if GLST
                   (append GLST (list (cons ENT NAM)))
                   (list (cons ENT NAM))
               )
       )
       (setq GRP (cdr GRP))          ; else shorten the edata
   )
   )
   GLST                              ; return the list
)

; ------------------- GET GROUP NAME FUNCTION --------------------
;   This function returns a list of all the group names in GLST
;   where ENT is a member. The list has the same form as GLST
; ----------------------------------------------------------------

(defun acet-txtexp-getgname (ENT GLST / GRP GDATA NAM NLST)
   (if (and GLST (listp GLST))
   (progn
       (foreach GRP GLST
         (setq GDATA (entget (car GRP)))
         (foreach ITM GDATA                   ; step through the edata
         (if (and
               (= (car ITM) 340)            ; if the item is a entity name
               (eq (setq NAM (cdr ITM)) ENT) ; and the ename being looked for
               )
             (setq NLST                     ; store the ename and name
                     (if NLST
                     (append NLST (list (cons (car GRP) (cdr GRP))))
                     (list (cons (car GRP) (cdr GRP)))
                     )
             )
         )
         )
       )
   )
   )
   NLST
)

; ----------------------------------------------------------------
;                        MAIN PROGRAM
; ----------------------------------------------------------------

(if (and                                                ; Are we in plan view?
       (equal (car (getvar "viewdir")) 0 0.00001)
       (equal (cadr (getvar "viewdir")) 0 0.00001)
       (> (caddr (getvar "viewdir")) 0)
   )

   (progn

   (prompt "\nSelect lines to be EXPLODED: ")

   (Setq FLTR    '((-4 . "<AND")
                     (-4 . "<OR")                      ; filter for mtext and text
                         (0 . "MTEXT")
                         (0 . "TEXT")
                     (-4 . "OR>")
                     (-4 . "<NOT")
                         (102 . "{ACAD_REACTORS")      ; and not leader text
                     (-4 . "NOT>")
                     (-4 . "AND>")
                  )
         GLST   (acet-txtexp-grplst)                           ; Get all the groups in drawing
         GDICT    (if GLST
                      (dictsearch (namedobjdict) "ACAD_GROUP")
                  )
         SS       (ssget);FLTR)
         CNT      0
   )
   ;; filter out the locked layers
   (if SS
       (setq SS (car (bns_ss_mod SS 1 T)))
   ) ;if

   ;; if we have anything left
   (if SS
       (progn
         (setq CNT 0)                                 ; Reset counter
         (while (setq ENT (ssname SS CNT))            ; step through each object in set

         (and
             GLST                                     ; if groups are present in the drawing
             (setq GNAM (acet-txtexp-getgname ENT GLST))          ; and the text item is in one or more
             (foreach GRP GNAM                        ; step through those groups
               (command "_.-group" "_r"               ; and remove the text item
               (cdr GRP) ENT ""
               )
             )
         )

         (setq TBX (acet-geom-textbox (entget ENT) 0))   ; get textbox points

         (setq TBX (mapcar '(lambda (x)
                              (trans x 1 0)         ; convert the points to WCS
                              )
                     TBX
                     )
         )

         (setq PTLST (append PTLST TBX))            ; Build list of bounding box
                                                      ; points for text items selected

         (setq CNT (1+ CNT))                        ; get the next text item
         ); while

         (setq PTLST (mapcar '(lambda (x)
                              (trans x 0 1)         ; convert all the points
                              )                     ; to the current ucs
                     PTLST
                   )
         )

         (if (setq ZM (acet-geom-zoom-for-select PTLST))          ; If current view does not contain
         (progn                                     ; all bounding box points
             (setq ZM
               (list
               (list (- (caar ZM) (acet-geom-pixel-unit))   ; increase zoom area by
                     (- (cadar ZM) (acet-geom-pixel-unit))    ; one pixel width to
                     (caddar ZM)                  ; sure nothing will be lost
               )
               (list (+ (caadr ZM) (acet-geom-pixel-unit))
                     (+ (cadadr ZM) (acet-geom-pixel-unit))
                     (caddr (cadr zm))
               )
               )
             )
             (if (setq vpna (acet-currentviewport-ename))
               (setq vplocked (acet-viewport-lock-set vpna nil))
             );if
             (command "_.zoom" "_w" (car ZM) (cadr ZM)); zoom to include text objects
         )
         )

         (setq VIEW   (acet-geom-view-points)
               TMPFIL   (strcat (getvar "tempprefix") "txtexp.wmf")
               PT1      (acet-geom-midpoint (car view) (cadr view))
               PT2      (list (car PT1) (cadadr VIEW))
         )

         (if (acet-layer-locked (getvar "clayer"))       ; if current layer is locked
         (progn
             (command "_.layer" "_unl" (getvar "clayer") ""); unlock it
             (setq LOCKED T)
         )
         )

         (command "_.mirror" SS "" PT1 PT2 "_y"
                  "_.WMFOUT" TMPFIL SS "")

         (if (findfile tmpfil)                           ; Does WMF file exist?
         (progn
             (command "_.ERASE" SS "")                   ; erase the orignal text
             (setq ss (acet-wmfin TMPFIL))               ; insert the WMF file
             (command "_.mirror" ss "" PT1 PT2 "_y")
         ) ;progn
         ) ;if


         (if LOCKED
         (command "_.layer" "_lock" (getvar "clayer") "") ; relock if needed
         ) ;if

         (if ZM (command "_.zoom" "_p"))            ; Restore original view if needed
         (if vplocked
             (acet-viewport-lock-set vpna T) ;re-lock the viewport if needed.
         );if
         (prompt (acet-str-format "\n%1 object(s) have been exploded to lines."CNT))
         (prompt "\nThe line objects have been placed on layer 0.")
       )
   )
   )
   (prompt "\nView needs to be in plan (0 0 1).")
);if equal
(acet-error-restore)                                  ; Retsore values
(princ)
)


(princ)

David Bethel 发表于 2022-7-6 01:54:44

当与线实体结合使用时,我仍然不同意使用术语“爆炸”。对不起-大卫

XIJIANGWOO 发表于 2022-7-6 01:58:49

谢谢Eldon的发帖。这是我第一次尝试发布代码(失败)。我正在尝试使用这个lisp,这样我可以自动分解所有缝合线型,而不是手动分解。我不知道如何更改行“提示”\n选择要分解的行:“只分解所有行或至少用“缝合”线型分解所有行。这听起来像是不可行的吗?

eldon 发表于 2022-7-6 02:03:38

 
把一条虚线变成几条被空格分割的短线的过程叫什么?
 
在AutoCAD的范围内,我认为很多人都会对“爆炸”这个表达感到高兴
 
 
为什么不能通过关闭/冻结其他所有内容来隔离要爆炸的线?然后用窗口选择选择所有线。

David Bethel 发表于 2022-7-6 02:05:12

 
 
根据直线的线型来分割直线,我认为它效率很低,可以称之为绘制的直线,因为这是基于向量的应用程序所看到的-大卫
页: [1] 2
查看完整版本: 修改“LinExp”lisp