stevesfr 发表于 2022-7-6 10:49:19

插入块时开始行

问候语:
在Acad的早期,可以重命名某些未使用的F键。在那些年里,我给F键分配了一个短lisp命令。
例如,在命令行输入行时,可以点击相应的F键(其中包含短lisp的命令),如果在块或其各自属性上的任何位置拾取,则该行将从块插入点开始。现在,我想知道如何重命名一个无用的F键,或者将我的小lisp合并到另一个lisp中,使其从拾取的块或其各自属性的插入点开始。
干杯
S

Lee Mac 发表于 2022-7-6 10:55:30

您可以这样透明地调用LISP:
 

(defun c:AtInsertion ( / obj )
(if
   (setq obj
      (SelectifFoo
      (lambda ( x / o )
          (setq o
            (vlax-ename->vla-object
            (cond
                (
                  (= (length x) 4) (car (last x))
                )
                (
                  (car x)
                )
            )
            )
          )
          (if (vlax-property-available-p o 'InsertionPoint)
            o
          )
      )
      "\nSelect Object: "
      )
    )
   (vlax-get obj 'InsertionPoint)
)
)

(defun SelectifFoo ( foo str / sel x )
(while
   (progn
   (setq sel (nentsel str))
   
   (cond
       (
         (vl-consp sel)

         (if (not (setq x (foo sel)))
         (princ "\n** Invalid Object Selected **")
         )
       )
   )
   )
)
x
)


_non 'AtInsertion

stevesfr 发表于 2022-7-6 10:55:51

 
李,这就是这里发生的事情:
如果拾取了块,则线从块插入点开始。如果拾取了块的属性,则线从拾取点开始。
 
以下是我使用的lisp:
 

;get insertion point of BLOCK by picking any attribute !
;
(DEFUN VV (/ PT1 PT2 PT5 PT6)
   (SETQ PT1 (ENTSEL "\nPick on BLOCK or ATTRIBUTE: "))
   (SETQ ENT(ENTGET (CAR PT1)))
   (SETQ PT5 (CDR (ASSOC 10 ENT)))
)

 
如果加载此lisp,并在输入line命令后,输入(VV)并拾取相应的属性,则线条将从块插入点开始。这是查找块插入点的非常方便的方法,其中有许多点块与点#、desc和高程等属性聚集在一起。
希望这对你更有帮助。
干杯
S

Lee Mac 发表于 2022-7-6 10:59:12

根据您给出的描述,我的印象是,如果选择了属性,您希望使用属性插入。。。

stevesfr 发表于 2022-7-6 11:03:08

 
李:你的解释是对的。我的错。最后一句应该是。。。无论是否拾取块或其属性,直线都从块的插入点开始。
对不起大家!
S

Lee Mac 发表于 2022-7-6 11:06:24

不用担心-您已经有了代码,但这可能更好:
 

(defun c:AtInsertion ( / obj )
(if
   (setq obj
   (SelectifFoo
       (lambda ( x )
         (if
         (vlax-property-available-p
             (setq x (vlax-ename->vla-object x)) 'InsertionPoint
         )
         x
         )
       )
       "\nSelect Object: "
   )
   )
   (trans (vlax-get obj 'InsertionPoint) (vlax-get obj 'Normal) 1)
)
)

(defun SelectifFoo ( foo str / sel x )
(while
   (progn
   (setq sel (entsel str))
   
   (cond
       (
         (vl-consp sel)

         (if (not (setq x (foo (car sel))))
         (princ "\n** Invalid Object Selected **")
         )
       )
   )
   )
)
x
)

alanjt 发表于 2022-7-6 11:09:56

不要忘记将您的点转换为UCS。李代码很好。
 
还有别的玩法。。。
 
(defun c:AI (/ ss)
(if (setq ss (ssget "_+.:E:S" '((0 . "INSERT"))))
   ((lambda (ins)
      (if (eq 1 (logand 1 (getvar 'cmdactive)))
      ins
      (command "_.line" "_non" ins)
      )
    )
   (trans (cdr (assoc 10 (entget (ssname ss 0)))) 0 1)
   )
)
)

alanjt 发表于 2022-7-6 11:13:49

哦,是的,您可以在CUI编辑器中编辑F键(称为加速键),但最简单的方法是创建MNU文件并从那里加载它们。此外,如果使用与MNU同名的MNL启动文件,它将在每次启动时自动加载。
 
这是我的艾伦·汤普森的剪辑。mnu文件:
***MENUGROUP=AlanThompson

***TOOLBARS

***ACCELERATORS
["F1"]^C^CEXCHPROP
["F4"]^C^CIMPORTLAYERS
["F5"]^C^CPEDIT _M
["F6"]^C^CM2P
["F7"]^C^C'MATH
'_zoom _p
 
我通过一个名为AlanThompson的文件加载我所有的lisp例程和设置。mnl公司
 
当我买了一台新电脑,我所要做的就是输入MenuLoad,加载我的AlanThompson。mnu文件,我可以走了。
 
仅供参考,请务必更改MENUGROUP名称(红色)。

stevesfr 发表于 2022-7-6 11:15:26

 
 
谢谢艾伦和李,我要开始思考。。。。什么是最好的。。
我曾想过以某种方式使用USERS5中保存的东西,然后在LINE命令后以某种方式调用它,以在触摸块或块属性时找到块插入点。但是
干杯
S

alanjt 发表于 2022-7-6 11:18:32

享受
 
请记住,如果使用Lee的,则需要将点转换为UCS,因为如果您不是WCS,则会产生不希望的结果。
页: [1] 2
查看完整版本: 插入块时开始行