DuanJinHui 发表于 2022-7-5 17:42:11

Entmake rect。


(command "_.rectang" "f" 10 (getpoint)(getpoint))

 
如何使用“entmake”函数做到这一点?

Lee Mac 发表于 2022-7-5 18:00:17

您需要计算8个顶点中每个顶点的位置,计算圆角的适当凸出值,然后使用此类顶点和凸出数据entmake(x)一个LWPOLYLINE实体。

DuanJinHui 发表于 2022-7-5 18:05:18

谢谢你,李,如果“f”=0,那么只有4个顶点?
 
看起来很难,我的数学和几何很差。

Lee Mac 发表于 2022-7-5 18:17:32

下面是一个供您学习的示例:
;; Rounded Rectangle Example-Lee Mac 2016

(defun c:myrect ( / blg lst ocs pt1 pt2 rad tmp )
   
   (setq rad 10.0) ;; Fillet Radius
   
   (if (and (setq pt1 (getpoint "\nSpecify 1st point: "))
            (setq pt2 ((if (zerop (getvar 'worlducs)) getpoint getcorner) pt1 "\nSpecify 2nd point: "))
       )
       (progn
         (setq ocs (trans '(0 0 1) 1 0 t)
               tmp (mapcar 'max pt1 pt2)
               pt1 (mapcar 'min pt1 pt2)
               pt2 tmp
               lst (list pt1 (list (car pt2) (cadr pt1)) pt2 (list (car pt1) (cadr pt2)))
               blg (1- (sqrt 2))
         )
         (if (equal rad 0.0 1e-
               (entmake
                   (append
                      '(   (000 . "LWPOLYLINE")
                           (100 . "AcDbEntity")
                           (100 . "AcDbPolyline")
                           (090 . 4)
                           (070 . 1)
                     )
                     (list (cons 038 (caddr (trans pt1 1 ocs))))
                     (mapcar '(lambda ( x ) (cons 10 (trans x 1 ocs))) lst)
                     (list (cons 210 ocs))
                   )
               )
               (entmake
                   (append
                      '(   (000 . "LWPOLYLINE")
                           (100 . "AcDbEntity")
                           (100 . "AcDbPolyline")
                           (090 .
                           (070 . 1)
                     )
                     (list (cons 038 (caddr (trans pt1 1 ocs))))
                     (apply 'append
                           (mapcar
                               (function
                                 (lambda ( a b )
                                       (apply 'append
                                           (mapcar
                                             (function
                                                   (lambda ( c d )
                                                       (list
                                                         (cons 10 (trans (mapcar '+ a c) 1 ocs))
                                                         (cons 42 d)
                                                       )
                                                   )
                                             )
                                             b (list blg 0.0)
                                           )
                                       )
                                 )
                               )
                               lst
                               (list
                                 (list (list 0 rad)   (list rad 0))
                                 (list (list (- rad) 0) (list 0 rad))
                                 (list (list 0 (- rad)) (list (- rad) 0))
                                 (list (list rad 0)   (list 0 (- rad)))
                               )
                           )
                     )
                     (list (cons 210 ocs))
                   )
               )
         )
       )
   )
   (princ)
)
上述内容也应在所有UCS和视图中兼容。

DuanJinHui 发表于 2022-7-5 18:26:13

 
非常感谢你!李。我会好好学习的!

Lee Mac 发表于 2022-7-5 18:38:44

 
不客气-请随时询问有关代码的任何问题。

DuanJinHui 发表于 2022-7-5 18:45:36

 
谢谢,我做了一点改变。
 
1.使用参数

(defun myrect (rad pt1 pt2 lay col / blg lst ocs tmp )
(if (and pt1 pt2 rad lay col)
       (progn
   ...
       ...

 
2.
(list (cons 038 (caddr (trans pt1 1 ocs))))
更改为-->
(list (cons 8 lay)(cons 62 col)(cons 038 (caddr (trans pt1 1 ocs))))
页: [1]
查看完整版本: Entmake rect。