mekis 发表于 2022-7-6 06:44:25

LISP,替换l的智能方法

你好
我正在寻找一种方法,用括号(块)查找并替换几行。有人有什么好主意吗?我要重放的所有线条都是线型“LBR”。
 

 
我可能会试着修改这个脚本,帮助我写作。欢迎一些好点子,谢谢。
 

; Move linetype <LBR> to layer <LBR>
(setq Layer "LBR")
(if (tblsearch "LAYER" Layer)
   (if (setq LSelect (ssget "_X" '((6 . "LBR"))))
   ((lambda (j / sn)
      (while
          (setq sn (ssname LSelect (setq j (1+ j))))
         (entupd
             (cdr
               (assoc
               -1
               (entmod (append (entget sn)
                                 (list '(6 . "BYLAYER")
                                       '(370 . -1)
                                       '(62 . 256)
                                       (cons 8 Layer)
                                 )
                         )
               )
               )
             )
         )
         )
       )
       -1
   )
   )
   (princ (strcat "\n Layer name <" Layer "> is not found <!>"))
)
(if LSelect
   (princ (strcat "\n <"
                  (itoa (sslength LSelect))
                  "> "
                  (if (> (sslength LSelect) 1)
                  "objects"
                  "object"
                  )
                  " moved to layer <"
                  Layer
                  ">"
          )
   )
)
(princ)
)

Tharwat 发表于 2022-7-6 06:58:22

选择线并获取其中点,然后将其用作括号块相对于选定线的角度的插入点。

mekis 发表于 2022-7-6 07:02:39

Thx,听起来很简单,当你说的时候,我想我必须检查线的角度,试试看

Tharwat 发表于 2022-7-6 07:18:25

提示:
*选择线图元。
*从检索起点和终点(dxf 10和dxf 11)获得角度。
*中点=从起点或终点形成的直线长度的一半距离,例如(极轴)。
*在中点插入支架块。
*删除线图元(如果需要)。
 
上载样例图形。

Lee Mac 发表于 2022-7-6 07:22:38

如果括号块的水平长度为1.0,则可以使用以下内容:

(defun c:addbrackets ( / ang blk dis enx inc pt1 pt2 sel )
   (if
       (and
         (setq blk (LM:ssget "\nSelect Bracket Block: " '("_+.:E:S" ((0 . "INSERT")))))
         (setq sel (LM:ssget "\nSelect Lines for Brackets: " '(((0 . "LINE")))))
       )
       (progn
         (setq blk (assoc 2 (entget (ssname blk 0))))
         (repeat (setq inc (sslength sel))
               (setq enx (entget (ssname sel (setq inc (1- inc))))
                     pt1 (cdr (assoc 10 enx))
                     pt2 (cdr (assoc 11 enx))
                     ang (angle pt1 pt2)
                     dis (distance pt1 pt2)
               )
               (if (and (< (/ pi 2.0) ang) (<= ang (/ (* 3.0 pi) 2.0)))
                   (setq ang (+ ang pi))
               )
               (entmake
                   (list '(0 . "INSERT") blk
                     (cons 10
                           (polar
                               (mapcar '(lambda ( a b ) (/ (+ a b) 2.0)) pt1 pt2)
                               (- ang (/ pi 2.0))
                               (/ dis 4.0)
                           )
                     )                              
                     (cons 50 ang)
                     (cons 41 dis)
                     (cons 42 dis)
                     (cons 43 dis)
                   )
               )
         )
       )
   )
   (princ)
)

;; ssget-Lee Mac
;; A wrapper for the ssget function to permit the use of a custom selection prompt
;;
;; Arguments:
;; msg    - selection prompt
;; params - list of ssget arguments

(defun LM:ssget ( msg params / sel )
   (princ msg)
   (setvar 'nomutt 1)
   (setq sel (vl-catch-all-apply 'ssget params))
   (setvar 'nomutt 0)
   (if (not (vl-catch-all-error-p sel)) sel)
)
(princ)

mekis 发表于 2022-7-6 07:28:26

mekis 发表于 2022-7-6 07:42:53

hi again,
i decided to draw a poly line insted, the proble is that i cant figure out in witch format the point is defined
 
;(setq BracketStart (643.75 320.00))
;(setq BracketEnd (31.25, 320.00))   
 
(setq BracketStart (getpoint "\nEnter start point: "))
(setq BracketEnd (getpoint "\nEnter end point: "))
 

(defun c:Bracket (/ BracketStart                   BracketEnd                   LegLength                   FirstLeg                   FirstMiddleLeg                   MidPoint                   LastMiddleLeg                   LastLeg                   PointList   ConstantSide                   BracketAngle                   BracketEnd   BracketLength   FirstAngle   LastAngle                   CurrentSettings);; Default Values (setq Bracket:LegLength 4.0CurrentSettings (mapcar '(lambda (x) (cons x (getvar x))) '("cmdecho" "clayer" "plinewid")) ) (setvar "CMDECHO" 0) ;; Begin Main Function (if   (and   ;(setq BracketStart (643.75 320.00))

mekis 发表于 2022-7-6 07:48:42

works...
draws brackets on all lines with linetype "LBR"... now it's easy to add a script that removes all lines with linetype LBR

(defun c:Bracket (/ BracketStart                   BracketEnd                   LegLength                   FirstLeg                   FirstMiddleLeg                   MidPoint                   LastMiddleLeg                   LastLeg                   PointList                   ConstantSide                   BracketAngle                   BracketEnd                   BracketLength                   FirstAngle                   LastAngle                   CurrentSettings);; Default Values (setq Bracket:LegLength 4.0CurrentSettings (mapcar '(lambda (x) (cons x (getvar x))) '("cmdecho" "clayer" "plinewid")) ) (setvar "CMDECHO" 0) (if    (if (setq lSet (ssget "_X" '((6 . "LBR"))))      (sssetfirst nil lSet)   )      (progn ;(1)   (setq inc (sslength lSet))   (repeat inc       (setq enx (entget (ssname lSet (setq inc (1- inc))))             ;pt1 (cdr (assoc 10 enx))             ;pt2 (cdr (assoc 11 enx))             BracketEnd (cdr (assoc 10 enx))             BracketStart (cdr (assoc 11 enx))       )            ; Begin Main Function       (if          (and         ;(setq BracketStart '(643.75 320.00 00.00))         ;(setq BracketEnd '(31.25 320.00 00.00))                      ;(setq BracketStart (getpoint "\nEnter start point: "))         ;(setq BracketEnd (getpoint "\nEnter end point: "))         )                  (progn         (setq ConstantSide   0.707106781185               LegLength      Bracket:LegLength               BracketLength(distance BracketStart BracketEnd)               BracketAngle   (angle BracketStart BracketEnd)               FirstAngle   (+ BracketAngle (* pi (/ 45 180.0)))               LastAngle      (+ BracketAngle (* pi (/ 135 180.0)))               FirstLeg       (polar BracketStart FirstAngle LegLength)               LastLeg      (polar BracketEnd LastAngle LegLength)               FirstMiddleLeg (polar FirstLeg                                       BracketAngle                                       (- (/ (distance FirstLeg LastLeg) 2.0)                                          (* LegLength ConstantSide)                                       )                              )               MidPoint       (polar FirstMiddleLeg FirstAngle LegLength)               LastMiddleLeg(polar LastLeg                                       (angle BracketEnd BracketStart)                                       (- (/ (distance FirstLeg LastLeg) 2.0)                                          (* LegLength ConstantSide)                                       )                              )               PointList      (list BracketStart                                    FirstLeg                                    FirstMiddleLeg                                    MidPoint                                    LastMiddleLeg                                    LastLeg                                    BracketEnd                              )         )                        (if (tblsearch "LAYER" "TEXT")             (command "_.layer" "_Thaw" "Text" "_Set" "Text" "")             (command "_.layer" "_Make" "Text" "")         )                        (if             (and               Bracket:Type               (= (strcase Bracket:Type) "LINE")             )             (command "_.line")             (progn               (setvar "PLINEWID" 0)               (command "_.pline")             )         )                        (foreach n PointList             (command "_non" n)         )         (command "")         (mapcar '(lambda (x) (setvar (car x)(cdr x))) CurrentSettings)         )       ) ; End Main Function   )   ) ;End Progn (1) ) (sssetfirst nil nil)(princ))
页: [1]
查看完整版本: LISP,替换l的智能方法