chelsea1307 发表于 2022-7-6 12:26:37

调整断点

我有一个lisp来插入块,90%都很好,插入的块大小相同,其中一些块会打断插入的线太多,下面的第一个插入很好,第二个在块的边缘(一个圆)和管道(acad中只有一条规则线)之间留有间隙,我连接了块,我知道这与第1和第2部分有关,但我不知道如何将它们改变到正确的点。
 
(defun c:gv (/ *error* scl dis ov vl
               lne pnt ang pt1 pt2)

;; Always localise your variables!

(or (not (zerop (setq scl (getvar "DIMSCALE"))))
   (setq scl 1.))

;; Dimscale may be zero - need to check for this

(setq dis (* scl 0.0703))

;; Use an Error Handler as we are tampering with Sys Vars

(defun *error* (msg)
   (if ov (mapcar 'setvar vl ov)) ; Reset Sys Vars   
   (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
   (princ (strcat "\n<< Error: " msg " >>")))
   (princ))

(setq vl '("CMDECHO" "OSMODE" "CLAYER") ; Sys Var list
       ov (mapcar 'getvar vl)) ; Get Old Sys Var Values

(if (or (tblsearch "BLOCK" "gv") ; Check for Block in Dwg...
         (findfile "gv.dwg"))   ;... And in Search path
   (progn
   
   (while ; While the following returns T
      
       (progn ; Wrap the following expressions
         
         (setq lne (entsel "\nSelect a Line: ")) ; Select a Line
         
         (cond ((null lne) t) ; Stay in Loop
               ((eq "LINE"
                  (cdr (assoc 0 (setq elst (entget (car lne)))))) nil) ; Exit Loop
               (t (princ "\n** Incorrect Selection **"))))) ; Stay in Loop
   
   (if (setq pt (getpoint "\nPick Insertion Point: ")) ; Prompt for Point
       (progn
         (setq ang (angle (cdr (assoc 10 elst)) (cdr (assoc 11 elst)))) ; Get Line Angle
         
         (mapcar 'setvar vl (list 0 0 (cdr (assoc 8 (entget (car lne))))))

         ; Set Sys Vars to how we want them - CMDECHO=0, OSMODE=0, CLAYER= <line layer>
         
         (command "-insert" "gv" pt scl scl (* 180. (/ ang pi))) ; insert Block

         ;; Prefix commands with "_." to make them language compatible
         
         (setq pt1 (polar pt ang dis)
               pt2 (polar pt (- ang pi) dis))
         
         (command "_.break" lne "_F" pt1 pt2))))
   
   (princ "\n<< Block Not Found >>")) ; Else the Block was not found

(mapcar 'setvar vl ov) ; Reset Sys Vars

(princ)) ; Exit Cleanly
 
(defun c:priser (/ *error* scl dis ov vl
               lne pnt ang pt1 pt2)

;; Always localise your variables!

(or (not (zerop (setq scl (getvar "DIMSCALE"))))
   (setq scl 1.))

;; Dimscale may be zero - need to check for this

(setq dis (* scl 0.0703))

;; Use an Error Handler as we are tampering with Sys Vars

(defun *error* (msg)
   (if ov (mapcar 'setvar vl ov)) ; Reset Sys Vars   
   (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
   (princ (strcat "\n<< Error: " msg " >>")))
   (princ))

(setq vl '("CMDECHO" "OSMODE" "CLAYER") ; Sys Var list
       ov (mapcar 'getvar vl)) ; Get Old Sys Var Values

(if (or (tblsearch "BLOCK" "priser") ; Check for Block in Dwg...
         (findfile "priser.dwg"))   ;... And in Search path
   (progn
   
   (while ; While the following returns T
      
       (progn ; Wrap the following expressions
         
         (setq lne (entsel "\nSelect a Line: ")) ; Select a Line
         
         (cond ((null lne) t) ; Stay in Loop
               ((eq "LINE"
                  (cdr (assoc 0 (setq elst (entget (car lne)))))) nil) ; Exit Loop
               (t (princ "\n** Incorrect Selection **"))))) ; Stay in Loop
   
   (if (setq pt (getpoint "\nPick Insertion Point: ")) ; Prompt for Point
       (progn
         (setq ang (angle (cdr (assoc 10 elst)) (cdr (assoc 11 elst)))) ; Get Line Angle
         
         (mapcar 'setvar vl (list 0 0 (cdr (assoc 8 (entget (car lne))))))

         ; Set Sys Vars to how we want them - CMDECHO=0, OSMODE=0, CLAYER= <line layer>
         
         (command "-insert" "priser" pt scl scl (* 180. (/ ang pi))) ; insert Block

         ;; Prefix commands with "_." to make them language compatible
         
         (setq pt1 (polar pt ang dis)
               pt2 (polar pt (- ang pi) dis))
         
         (command "_.break" lne "_F" pt1 pt2))))
   
   (princ "\n<< Block Not Found >>")) ; Else the Block was not found

(mapcar 'setvar vl ov) ; Reset Sys Vars

(princ)) ; Exit Cleanly
GV。图纸
普里泽。图纸

chelsea1307 发表于 2022-7-6 12:56:54

下图显示了GV(线上的第一个块),线在GV的边缘线处断开,然后显示圆棱镜和不与圆边缘相交的线。我希望他们能像对待GV一样面对边缘

CarlB 发表于 2022-7-6 13:26:18

“priser”块小于GV。
 
在以下行中:
(setq dis(*scl 0.0703)
 
将其更改为:
(setq dis(*scl 0.0469)
 
因为这是棱镜半径的值

chelsea1307 发表于 2022-7-6 13:36:31

很抱歉,很长一个周末没有回复。这很好用。。。谢谢
页: [1]
查看完整版本: 调整断点