CafeJr 发表于 2022-7-6 03:30:15

测量或分割对象-wit

伙计们,
 
我很好奇,有人知道如何使用命令:测量或分割。
 
我需要在一条追踪线上分布一个块,但它们之间的空间相同,这些命令会放置距离,因此,当作为参考的对象发生倾斜时,距离跟随对象,但最终距离有一个小错误,因为倾斜度。。。下面我在一些图片中展示了我试图解释的内容,有人知道一个LISP代码可以帮上忙吗?
 
谢谢
 

Lee Mac 发表于 2022-7-6 03:38:55

试试这个快速破解:
 

(defun c:mymeasure ( / di en in ln ob p1 p2 sn sp x1 )
   (while
       (progn
         (setvar 'errno 0) (setq en (car (entsel "\nSelect object to measure: ")))
         (cond
               (   (= 7 (getvar 'errno))
                   (princ "\nMissed, try again.")
               )
               (   (= 'ename (type en))
                   (if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-curve-getendparam (list en)))
                     (princ "\nInvalid object selected.")
                   )
               )
         )
       )
   )
   (if (and (= 'ename (type en))
         (progn
               (initget 6)
               (setq di (getdist "\nSpecify length of segment: "))
         )
       )
       (progn
         (setq p1 (vlax-curve-getstartpoint en)
               p2 (vlax-curve-getendpoint   en)
               x1 (abs (- (car p2) (car p1)))
               sn (fix (/ x1 di))
               x1 (+ (min (car p1) (car p2)) (/ (- x1 (* di sn)) 2.0))
               ob (vlax-ename->vla-object en)
               sp (vlax-get-property (vla-get-activedocument (vlax-get-acad-object))
                        (if (= 1 (getvar 'cvport))
                            'paperspace
                            'modelspace
                        )
                  )
         )
         (repeat (1+ sn)
               (setq ln (vlax-invoke sp 'addline (list x1 0.0 0.0) (list x1 1.0 0.0)))
               (if (setq in (vlax-invoke ob 'intersectwith ln acextendotherentity))
                   (entmake (list '(0 . "POINT") (list 10 (car in) (cadr in) (caddr in))))
               )
               (vla-delete ln)
               (setq x1 (+ x1 di))
         )
       )
   )
   (princ)
)
(vl-load-com) (princ)

amarcon 发表于 2022-7-6 03:47:33

这是一个很好的例程,但是我们怎么能用“BLOCKNAME”代替你的“entmake POINT”?
谢谢

CafeJr 发表于 2022-7-6 04:03:38

哇。。。非常感谢“李麦克”!。。。这正是我需要的!。。。我只需要将点名称交换到一个块,以便在我的应用程序上更快!。。。但是它帮了我很多!!!。。。

Lee Mac 发表于 2022-7-6 04:07:26

不客气
 
尝试以下操作,更改高亮显示的块名称以适合:

(defun c:mymeasure ( / *error* bd bn cm di en in ln ob p1 p2 sn sp x1 )

   (setq bn "myblock") ;; Name of block to insert

   (defun *error* ( msg )
       (if (and (= 'vla-object (type ln)) (not (vlax-erased-p ln)))
         (vl-catch-all-apply 'vla-delete (list ln))
       )
       (if (= 'int (type cm))
         (setvar 'cmdecho cm)
       )
       (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
         (princ (strcat "\nError: " msg))
       )
       (princ)
   )

   (cond
       (   (= 4 (logand 4 (cdr (assoc 70 (tblsearch "layer" (getvar 'clayer))))))
         (princ "\nCurrent layer locked.")
       )
       (   (not
               (or (tblsearch "block" bn)
                   (and (setq bd (findfile (strcat bn ".dwg")))
                     (progn
                           (setq cm (getvar 'cmdecho))
                           (setvar 'cmdecho 0)
                           (command "_.-insert" bd nil)
                           (setvar 'cmdecho cm)
                           (tblsearch "block" bn)
                     )
                   )
               )
         )
         (princ (strcat "\nBlock \"" bn "\" not found."))
       )
       (   (progn
               (while
                   (progn
                     (setvar 'errno 0) (setq en (car (entsel "\nSelect object to measure: ")))
                     (cond
                           (   (= 7 (getvar 'errno))
                               (princ "\nMissed, try again.")
                           )
                           (   (= 'ename (type en))
                               (if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-curve-getendparam (list en)))
                                 (princ "\nInvalid object selected.")
                               )
                           )
                     )
                   )
               )
               (/= 'ename (type en))
         )
       )
       (   (progn
               (initget 6)
               (setq di (getdist "\nSpecify length of segment: "))
         )
         (setq p1 (vlax-curve-getstartpoint en)
               p2 (vlax-curve-getendpoint   en)
               x1 (abs (- (car p2) (car p1)))
               sn (fix (/ x1 di))
               x1 (+ (min (car p1) (car p2)) (/ (- x1 (* di sn)) 2.0))
               ob (vlax-ename->vla-object en)
               sp (vlax-get-property (vla-get-activedocument (vlax-get-acad-object))
                        (if (= 1 (getvar 'cvport))
                            'paperspace
                            'modelspace
                        )
                  )
         )
         (repeat (1+ sn)
               (setq ln (vlax-invoke sp 'addline (list x1 0.0 0.0) (list x1 1.0 0.0)))
               (if (setq in (vlax-invoke ob 'intersectwith ln acextendotherentity))
                   (vlax-invoke sp 'insertblock (mapcar '+ in '(0.0 0.0 0.0)) bn 1.0 1.0 1.0 0.0)
               )
               (vla-delete ln)
               (setq x1 (+ x1 di))
         )
       )
   )
   (princ)
)
(vl-load-com) (princ)

CafeJr 发表于 2022-7-6 04:13:54

“李麦克”!。。。它工作得很好!。。。谢谢!!!。。。

CafeJr 发表于 2022-7-6 04:28:20

我在代码中添加了一个小问题以获得块名:
 
(defun c:mymeasure ( / *error* bd bn cm di en in ln ob p1 p2 sn sp x1 )
   ;(setq bn "Botão") ; Name of block to insert ("myblock")
   (setq bn (getstring "\nEnter with block Name: "))
   (defun *error* ( msg )

   (if (and (= 'vla-object (type ln)) (not (vlax-erased-p ln)))
         (vl-catch-all-apply 'vla-delete (list ln))
       )
       (if (= 'int (type cm))
         (setvar 'cmdecho cm)
       )
       (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
         (princ (strcat "\nError: " msg))
       )
       (princ)
   )
   (cond
       (   (= 4 (logand 4 (cdr (assoc 70 (tblsearch "layer" (getvar 'clayer))))))
         (princ "\nCurrent layer locked.")
       )
       (   (not
               (or (tblsearch "block" bn)
                   (and (setq bd (findfile (strcat bn ".dwg")))
                     (progn
                           (setq cm (getvar 'cmdecho))
                           (setvar 'cmdecho 0)
                           (command "_.-insert" bd nil)
                           (setvar 'cmdecho cm)
                           (tblsearch "block" bn)
                     )
                   )
               )
         )
         (princ (strcat "\nBlock \"" bn "\" not found."))
       )
       (   (progn
               (while
                   (progn
                     (setvar 'errno 0) (setq en (car (entsel "\nSelect object to measure: ")))
                     (cond
                           (   (= 7 (getvar 'errno))
                               (princ "\nMissed, try again.")
                           )
                           (   (= 'ename (type en))
                               (if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-curve-getendparam (list en)))
                                 (princ "\nInvalid object selected.")
                               )
                           )
                     )
                   )
               )
               (/= 'ename (type en))
         )
       )
       (   (progn
               (initget 6)
               (setq di (getdist "\nSpecify length of segment: "))
         )
         (setq p1 (vlax-curve-getstartpoint en)
               p2 (vlax-curve-getendpoint   en)
               x1 (abs (- (car p2) (car p1)))
               sn (fix (/ x1 di))
               x1 (+ (min (car p1) (car p2)) (/ (- x1 (* di sn)) 2.0))
               ob (vlax-ename->vla-object en)
               sp (vlax-get-property (vla-get-activedocument (vlax-get-acad-object))
                        (if (= 1 (getvar 'cvport))
                            'paperspace
                            'modelspace
                        )
                  )
         )
         (repeat (1+ sn)
               (setq ln (vlax-invoke sp 'addline (list x1 0.0 0.0) (list x1 1.0 0.0)))
               (if (setq in (vlax-invoke ob 'intersectwith ln acextendotherentity))
                   (vlax-invoke sp 'insertblock (mapcar '+ in '(0.0 0.0 0.0)) bn 1.0 1.0 1.0 0.0)
               )
               (vla-delete ln)
               (setq x1 (+ x1 di))
         )
       )
   )
   (princ)
)
(vl-load-com) (princ)

Lee Mac 发表于 2022-7-6 04:30:22

不客气!
页: [1]
查看完整版本: 测量或分割对象-wit