我很乐意帮你,但我的知识还不够。
希望罗伊043的回答有一些用处。
我确实喜欢拉伸的工作方式,像正常行为一样,它与CP一起工作。但我注意到,虽然在拾取pt1后,它不会像正常的ACAD拉伸那样从一个点开始断裂。
太挑剔了!我只想让它的核心功能发挥作用。 我将使用一个函数来重新计算相对于pt1的pt2。
; Round half towards pos. or neg. infinity.
(defun Round (num)
(fix ((if (minusp num) - +) num 0.5))
)
; Recalculate pt so that the X, Y and Z distance to base are n times dim.
(defun ModularizePoint (pt base dim)
(mapcar
'(lambda (coorPt coorBase)
(+ coorBase (* dim (Round (/ (- coorPt coorBase) (float dim)))))
)
pt
base
)
)
(defun c:bsx (/ *error* vl ov ss pt1 pt2 gridx ansx)
(defun *error* (msg)
(if ov (mapcar 'setvar vl ov))
(if (not (wcmatch (strcase msg) "*CANCEL*,*EXIT*"))
(princ (strcat "\n<< Error: " msg " >>"))
)
(princ)
)
(setq vl '("CMDECHO"))
(setq ov (mapcar 'getvar vl))
(mapcar 'setvar vl '(0))
(if
(and
(princ "\nSelect entities to stretch by crossing-window or crossing-polygon: ")
(setq ss (ssget))
(setq pt1 (getpoint "\nSelect Base Point: "))
(setq pt2 (getpoint pt1 "\nSelect Second Point: "))
)
(progn
(initget "215mm 225mm 235mm Custom LockXOnly")
(setq ansx (getkword "\nX Brick Size ? <225mm>: "))
(cond
((or (not ansx) (= "215mm" ansx))
(setq gridx 215)
)
((= "225mm" ansx)
(setq gridx 225)
)
((= "235mm" ansx)
(setq gridx 235)
)
((= "Custom" ansx)
(setq gridx (getint))
)
)
(if gridx (setq pt2 (ModularizePoint pt2 pt1 gridx)))
(command "_.stretch" ss "" "_non" pt1 "_non" (list (car pt2) (cadr pt1)))
(princ
(strcat
"\nLocked axis dim " (if gridx "ON " "OFF ")
"\nStretched on X: " (rtos (- (car pt2) (car pt1))) " "
)
)
)
)
(mapcar 'setvar vl ov)
(princ)
) 谢谢Roy_043。
对不起,我没有早点回来。我生病了。
这是Grrrs lisp的不同变体。但不幸的是,它不能根据CO-或CO+来增加或减少10mm。
在拾取对象之前,是否可以添加拉伸选项,使拉伸跨越到所选砖层的增量?
我附加了一个dwg,以更清楚地说明我希望拉伸如何工作。
砖拉伸试验。图纸 试试这个:
(vl-load-com)
; Round half towards pos. or neg. infinity.
(defun Round (num)
(fix ((if (minusp num) - +) num 0.5))
)
; Recalculate pt so that the X, Y and Z distance to base are n times module plus joint.
(defun ModularizePoint (pt base module joint)
(mapcar
'(lambda (coordPt coordBase)
(+ coordBase joint (* module (Round (/ (- coordPt coordBase) (float module)))))
)
pt
base
)
)
(defun c:bsx (/ *error* doc ansx gridx jointx pt1 pt2 ss)
(defun *error* (msg)
(setvar 'cmdecho 1)
(vla-endundomark doc)
(if (not (wcmatch (strcase msg) "*CANCEL*,*EXIT*"))
(princ (strcat "\n<< Error: " msg " >>"))
)
(princ)
)
(setq doc (vla-get-activedocument (setq cad (vlax-get-acad-object))))
(vla-endundomark doc)
(vla-startundomark doc)
(if
(and
(princ "\nSelect entities to stretch by crossing-window or crossing-polygon: ")
(setq ss (ssget))
(setq pt1 (getpoint "\nSelect Base Point: "))
(setq pt2 (getpoint pt1 "\nSelect Second Point: "))
)
(progn
(setvar 'cmdecho 0)
(initget "Stand Min Plus Custom None")
(setq ansx (getkword "\nX Brick Size (Standard=112.5 Joint=10)? <Stand>: "))
(cond
((or (not ansx) (= "Stand" ansx))
(setq gridx 112.5)
(setq jointx 0.0)
)
((= "Min" ansx)
(setq gridx 112.5)
(setq jointx -10.0)
)
((= "Plus" ansx)
(setq gridx 112.5)
(setq jointx 10.0)
)
((= "Custom" ansx)
(setq gridx (getreal "\nCustom size: "))
(setq jointx 0.0)
)
)
(if gridx (setq pt2 (ModularizePoint pt2 pt1 gridx jointx)))
(command "_.stretch" ss "" "_non" pt1 "_non" (list (car pt2) (cadr pt1)))
(princ
(strcat
"\nModular dimension: " (if gridx "ON " "OFF ")
"\nStretched on X: " (rtos (- (car pt2) (car pt1))) " "
)
)
(setvar 'cmdecho 1)
)
)
(vla-endundomark doc)
(princ)
) 谢谢太好了,这是朝着正确方向迈出的一步。
当它在负X轴上拉伸时会出现问题。请参阅附图以查看问题。
大体上在X正方向拉伸有效,但在负方向拉伸与预期结果相反。如果我选择+10mm选项,则为-10mm,如果为-10mm,则为+10mm接头。
是否有任何可能的方法来选择关节类型,然后拉伸捕捉到增量?如果没有,也没问题。这样可以更容易地看到拉伸的最终位置。
砖拉伸问题。图纸 捕捉到增量是有问题的。如果关节不为零,则需要根据拉伸方向更改snapbase。下面的代码显示网格(不考虑关节)。
(vl-load-com)
; Round half towards pos. or neg. infinity.
(defun Round (num)
(fix ((if (minusp num) - +) num 0.5))
)
; Recalculate pt so that the X, Y and Z distance to base are n times module plus joint.
(defun ModularizePoint (pt base module joint)
(mapcar
'(lambda (coordPt coordBase / delta)
(setq delta (* module (Round (/ (- coordPt coordBase) (float module)))))
(cond
((zerop delta)coordBase)
((minusp delta) (+ coordBase delta (- joint)))
(T (+ coordBase delta joint))
)
)
pt
base
)
)
(defun SetVars (lst)
(mapcar
'(lambda (sub / old)
(setq old (getvar (car sub)))
(if (cadr sub) (setvar (car sub) (cadr sub)))
(list (car sub) old)
)
lst
)
)
(defun c:bsx (/ *error* doc ansx gridx jointx pt1 pt2 ss vars)
(defun *error* (msg)
(if vars (SetVars vars))
(vla-endundomark doc)
(if (not (wcmatch (strcase msg) "*CANCEL*,*EXIT*"))
(princ (strcat "\n<< Error: " msg " >>"))
)
(princ)
)
(setq doc (vla-get-activedocument (setq cad (vlax-get-acad-object))))
(vla-endundomark doc)
(vla-startundomark doc)
(if
(and
(princ "\nSelect entities to stretch by crossing-window or crossing-polygon: ")
(setq ss (ssget))
(progn
(initget "Stand Minus Plus Custom None")
(setq ansx (getkword "\nX Brick Size (Standard=112.5 Joint=10)? <Stand>: "))
(cond
((or (not ansx) (= "Stand" ansx))
(setq gridx 112.5)
(setq jointx 0.0)
)
((= "Minus" ansx)
(setq gridx 112.5)
(setq jointx -10.0)
)
((= "Plus" ansx)
(setq gridx 112.5)
(setq jointx 10.0)
)
((= "Custom" ansx)
(setq gridx (getreal "\nCustom size: "))
(setq jointx 0.0)
)
)
T
)
(setq pt1 (getpoint "\nSelect Base Point: "))
(setq vars
(SetVars
(if (= "None" ansx)
'((cmdecho 0))
(list
'(cmdecho 0)
(list 'snapbase pt1)
'(griddisplay 1)
'(gridmode 1)
(list 'gridunit (list gridx gridx))
)
)
)
)
(setq pt2 (getpoint pt1 "\nSelect Second Point: "))
)
(progn
(if gridx (setq pt2 (ModularizePoint pt2 pt1 gridx jointx)))
(command "_.stretch" ss "" "_non" pt1 "_non" (list (car pt2) (cadr pt1)))
(princ
(strcat
"\nModular dimension: " (if gridx "ON " "OFF ")
"\nStretched on X: " (rtos (- (car pt2) (car pt1))) " "
)
)
)
)
(if vars (SetVars vars))
(vla-endundomark doc)
(princ)
) 我现在不在AutoCAD,但在周末,我痛苦地试图让你的代码正常工作。
我试图将网格设置为共测量,如果选择了任何砖块选项,则拉伸将遵循该选项,并根据命令开始时选择的值,然后将拉伸减去或添加10mm。
初始网格不一定要考虑关节,因为它只是一个粗略的引导,但最终拉伸将。
出现错误:
Select Base Point:
<< Error: AutoCAD variable setting rejected: SNAPBASE (452.5 4278.5 0.0) >>
如果它能像17号岗位那样工作。我不介意扣子是否与砖层的选择不符。
看见http://www.cadtutor.net/forum/showthread.php?99652-X轴拉伸-带-choosen-value-in-they-increments&p=678648&viewfull=1#post678648
Snapbase需要二维点:
替换:
(list 'snapbase pt1)
使用:
(list 'snapbase (reverse (cdr (reverse pt1))))
(list 'snapbase (vl-remove (last pt1) pt1))
_$ (setq pt (getpoint))
(0.0 0.0 0.0)
_$ (vl-remove (last pt) pt)
nil
_$
谢谢Grrr。BricsCAD在此处接受三维点:
: (setvar 'snapbase '(1 2 3))
(1 2 3)
: (getvar 'snapbase)
(1.0 2.0)
页:
1
[2]