anishtain4 发表于 2022-7-6 08:10:25

在屏幕上显示对象

我想画一个定义了宽度和长度的矩形,但用户选择插入点和旋转。但问题是,我希望用户在指向插入点时看到对象,就像插入块一样

MSasu 发表于 2022-7-6 08:19:23

您应该使用第一个点作为第二次交互的参数(可以使用GETCORNER而不是GETPOINT):
(setq Point1st (getpoint "\First corner: ")
   Point2nd (getcorner Point1st "\nSecond corner: "))
 
当做
米尔恰

anishtain4 发表于 2022-7-6 08:21:44

我知道这一点,但当您选择第一个或第二个点时,不会显示对象,我希望如此

MSasu 发表于 2022-7-6 08:25:27

对不起,我想我误读了你的第一句话。你想要预览一个自定义形状和他的方向吗?
为此,您应该检查GRREAD、GRDRAW和GRVECS函数-您将在论坛上找到一些很棒的示例。
 
当做
米尔恰

VVA 发表于 2022-7-6 08:31:01

我认为这可以通过使用grread实现
GRREAD使用示例-让我们分享
在屏幕上显示光标附近的任何文本
http://www.theswamp.org/index.php?action=search2

anishtain4 发表于 2022-7-6 08:35:35

是的,这正是我想要的,非常感谢

Lee Mac 发表于 2022-7-6 08:40:20

grread函数将暂停以获取某种形式的用户输入,然后返回有关检测到的用户输入的信息,无论是光标位置、鼠标单击还是键盘输入。
 
在while循环中使用时,您可以连续监视用户输入并相应地更新显示。
 
但是,grread功能的一个主要缺点是,在暂停以供用户输入时,所有标准AutoCAD功能都被禁用。这意味着用户无法访问对象捕捉、跟踪、正交模式等。对于大多数绘图操作来说,仅为了实现奇特效果而进行这种权衡通常不是一种选择。
 
任务的另一种选择可能是使用内置RECTANG命令提供的各种选项,例如:
 
(defun c:MyRec ( / p1 )
   (if (setq p1 (getpoint "\nSpecify First Corner: "))
       (progn
         (command "_.rectang" "_non" p1 "_D" 4 2)
         (while (= 1 (logand 1 (getvar 'CMDACTIVE)))
               (command pause)
         )
       )
   )
   (princ)
)

Stefan BMR 发表于 2022-7-6 08:46:22

(defun C:TEST ( / ss len wd el)
(if (not (tblsearch "BLOCK" "MyRectangle"))
   (progn
   (setq ss (ssadd)
         ss (ssadd (entmakex '((0 . "LINE") (10 0.0 0.0 0.0) (11 1.0 0.0 0.0))) ss)
         ss (ssadd (entmakex '((0 . "LINE") (10 1.0 0.0 0.0) (11 1.0 1.0 0.0))) ss)
         ss (ssadd (entmakex '((0 . "LINE") (10 1.0 1.0 0.0) (11 0.0 1.0 0.0))) ss)
         ss (ssadd (entmakex '((0 . "LINE") (10 0.0 1.0 0.0) (11 0.0 0.0 0.0))) ss)
         )
   (command "BLOCK" "MyRectangle" '(0 0 0) ss "")
   )
   )
(if
   (and
   (setq len (getdist "\Length: "))
   (setq wd (getdist "\Width: "))
   )
   (progn
   (setq el (entlast))
   (command "INSERT" "MyRectangle" "X" len "Y" wd)
   (while (= 1 (getvar 'cmdactive))
       (command pause)
       )
   (if (not (eq el (entlast)))
       (command "EXPLODE" "L" ""
                "PEDIT" "M" "P" "" "Y" "J" "" "")
       )
   )
   )
(princ)
)

MSasu 发表于 2022-7-6 08:51:31

不错,斯特凡。
如果你不介意,我将发表一些评论:
[列表=1]
[*]尝试禁用CMDECHO以对提示符产生干净的影响。
[*]为了使这更具活力,可以先要求尺寸,然后按比例构建“图标”;当不再有用时清除它。
[*]使用EXPLODE命令时,无需关闭选择周期。
(command "EXPLODE" "L" "")
问候,
米尔恰

Lee Mac 发表于 2022-7-6 08:52:07

好主意,Stefan,这是对你的代码的一点改进,希望你不介意:
 

(defun c:brec

   ( / *error* _getdist en va vr )

   ;; Block Rectangle
   ;; By Lee Mac, based on ideas by Stefan BMR

   (defun *error* ( msg )
       (if va (mapcar 'setvar vr va))
       (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
         (princ (strcat "\nError: " msg))
       )
       (princ)
   )

   (if (null (tblsearch "BLOCK" "$MyRectangle$"))
       (progn
         (entmake
            '(
                   (0 . "BLOCK")
                   (8 . "0")
                   (2 . "$MyRectangle$")
                   (10 0.0 0.0 0.0)
                   (70 . 0)
               )
         )
         (entmake
            '(
                   (0 . "LWPOLYLINE")
                   (100 . "AcDbEntity")
                   (100 . "AcDbPolyline")
                   (8 . "0")
                   (90 . 4)
                   (70 . 1)
                   (10 0.0 0.0)
                   (10 1.0 0.0)
                   (10 1.0 1.0)
                   (10 0.0 1.0)
               )
         )
         (entmake
            '(
                   (0 . "ENDBLK")
                   (8 . "0")
               )
         )
       )
   )

   (defun _getdist ( a b c )
       (set a
         (cond
               (
                   (getdist
                     (strcat b " <"
                           (rtos (set a (cond ( (eval a) ) ( c )))) ">: "
                     )
                   )
               )
               (   (eval a)   )
         )
       )
   )

   (setq vr '(CMDECHO QAFLAGS)
         va(mapcar 'getvar vr)
   )
   (mapcar 'setvar vr '(0 1))
   (_getdist '*len* "\nSpecify Length" 1.0)
   (_getdist '*wid* "\nSpecify Width"1.0)

   (setq en (entlast))
   (command "_.-insert" "$MyRectangle$" "_X" *len* "_Y" *wid*)
   (princ "\nSpecify Insertion Point: ")
   (setvar 'CMDECHO 1)
   (while (= 1 (logand 1 (getvar 'CMDACTIVE)))
       (command pause)
   )
   (setvar 'CMDECHO 0)
   (if (not (equal en (setq en (entlast))))
       (command "_.explode" en "")
   )
   (mapcar 'setvar vr va)
   (princ)
)
页: [1] 2
查看完整版本: 在屏幕上显示对象