【问题标题】:Creating a rectangle from center point with existing height and width size从中心点创建一个具有现有高度和宽度大小的矩形
【发布时间】:2021-08-29 09:20:39
【问题描述】:

我试图从其中心点创建一个 10 x 10 的矩形。我发现现有代码通过其中心点创建一个矩形,但用户必须通过选择对角来指定大小。我想用已知尺寸 10 x 10 替换手动部件。用户选择一个点,然后从该中心点创建一个 10 x 10 矩形。

这是我找到的现有代码:

(defun C:CENRECT ( / pt1 ptc vec)

    (setq pt1 (getpoint "\nSpecify the center point: "))
    (setq ptc (getpoint pt1 "\nSpecify the corner point: "))
    (setq vec (mapcar '- ptc pt1))

    (entmake
        (list
            '(000 . "LWPOLYLINE")
            '(100 . "AcDbEntity")
            '(100 . "AcDbPolyline")
            '(090 . 4)
            '(070 . 1)
            (cons 010 (trans (mapcar '+ pt1 (list (-(car vec))(+(cadr vec))(caddr vec))) 1 0))
            (cons 010 (trans (mapcar '+ pt1 (list (+(car vec))(cadr vec)(caddr vec))) 1 0))
            (cons 010 (trans (mapcar '+ pt1 (list (+(car vec))(-(cadr vec))(caddr vec))) 1 0))
            (cons 010 (trans (mapcar '+ pt1 (list (-(car vec))(-(cadr vec))(caddr vec))) 1 0))
            (cons 210 (trans '(0.0 0.0 1.0) 1 0 T))
        )
    )

    (redraw)
    (princ)
)

在这里,我尝试添加 10 x 10 的已知尺寸,而不是让用户手动选择尺寸。

(defun C:test ( / pt1 ptc vec len wid)
    (setq pt1 (getpoint "\nSpecify the center point: "))
    **(setq len 10)
    (setq wid 10)**
    (setq ptc (getpoint pt1 **len wid**))
    (setq vec (mapcar '- ptc pt1))

    (entmake
        (list
            '(000 . "LWPOLYLINE")
            '(100 . "AcDbEntity")
            '(100 . "AcDbPolyline")
            '(090 . 4)
            '(070 . 1)
            (cons 010 (trans (mapcar '+ pt1 (list (-(car vec))(+(cadr vec))(caddr vec))) 1 0))
            (cons 010 (trans (mapcar '+ pt1 (list (+(car vec))(cadr vec)(caddr vec))) 1 0))
            (cons 010 (trans (mapcar '+ pt1 (list (+(car vec))(-(cadr vec))(caddr vec))) 1 0))
            (cons 010 (trans (mapcar '+ pt1 (list (-(car vec))(-(cadr vec))(caddr vec))) 1 0))
            (cons 210 (trans '(0.0 0.0 1.0) 1 0 T))
        )
    )

    (redraw)
    (princ)
)

我得到一个参数太多的错误。需要弄清楚如何给出 10 x 10 的对角而不是用户做的。

【问题讨论】:

    标签: lisp autocad autolisp


    【解决方案1】:

    由于您提前知道生成的矩形的固定尺寸,因此可以将代码简化为以下内容:

    (defun c:cenrect ( / c z )
        (setq z (trans '(0 0 1) 1 0 t))
        (if (setq c (getpoint "\nSpecify center: "))
            (entmake
                (list
                   '(000 . "LWPOLYLINE")
                   '(100 . "AcDbEntity")
                   '(100 . "AcDbPolyline")
                   '(090 . 4)
                   '(070 . 1)
                    (cons 010 (trans (mapcar '+ c '(-5 -5)) 1 z))
                    (cons 010 (trans (mapcar '+ c '( 5 -5)) 1 z))
                    (cons 010 (trans (mapcar '+ c '( 5  5)) 1 z))
                    (cons 010 (trans (mapcar '+ c '(-5  5)) 1 z))
                    (cons 210 z)
                )
            )
        )
        (princ)
    )
    

    这里,折线顶点是相对于提供的中心点(相对于活动 UCS)计算的,然后这些顶点相对于对象坐标系 (OCS) 进行变换。

    【讨论】:

      【解决方案2】:
      (setq pt1 (getpoint "\nSpecify the center point: "))
      (setq len 10)
      (setq wid 10)
      (setq vec (list len wid 0 ))
      
      (entmake...... 
      )
      

      应该没问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多