byghbcx 发表于 2007-4-9 09:00:00
<p>先定义一个块,再用MEASURE命令.lsp也可以做,但计算要复杂点,对多义线,首先要求出每隔1.5米的所有点,然后分别求出该点的法线角度,也就可以达到目的要求了.</p>lht 发表于 2007-4-9 10:18:00
<p>(defun c:kjh ( / )<br/>(setvar "osmode" 0) ;关闭捕捉<br/>(command"_pline" (list 0 0) (list 100 0) "") ;画长为100的水平线<br/>(command"_pline" (list 0 0) (list 0 0.5) "") ;画长为0.5的垂直线<br/>(command "-array" (entlast) "" "r" 1 101 1 "");1行,101列,列距为1的矩阵<br/>(setvar "osmode" 35) ;打开捕捉<br/>)</p>lht 发表于 2007-4-9 10:20:00
<p>(defun c:kjh ( / )<br/>(setvar "osmode" 0) ;关闭捕捉<br/>(command"_pline" (list 0 0) (list 100 0) "") ;画长为100的水平线<br/>(command"_pline" (list 0 0) (list 0 0.5) "") ;画长为0.5的垂直线<br/>(command "-array" (entlast) "" "r" 1 101 1 "");1行,101列,列距为1的矩阵<br/>(setvar "osmode" 35) ;打开捕捉<br/>)</p>byghbcx 发表于 2007-4-9 11:19:00
多义线只是水平的吗?只有一段吗?这有点太简单了wei209 发表于 2007-4-9 16:49:00
<p>"-array" 改为 "_array"</p><p></p>alin 发表于 2007-4-10 21:45:00
;;; ***************<br/>;;; By Alvin Y. LIN<br/>;;; ***************<br/>(defun C:test (/ interval width initlen oldOSMODE<br/> plObj ent startPoint endPoint initPoint<br/> revp len interval num cnt<br/> rotang firstDeriv pt stPoint selPoint<br/> )<br/> (setq interval 1000 ; 1m<br/> width 500 ; 0.5m<br/> initlen 0 ;????<br/> )<br/> (setq oldOSMODE (getvar "OSMODE"))<br/> (command "ucs" "w")<br/> (setq plObj (vlax-ename->vla-object<br/> (car<br/> (setq ent (entsel "\nSelect an object: "))<br/> )<br/> )<br/> )<br/> (if (member (vla-get-objectname plObj)<br/> '("AcDbPolyline" "AcDbLine" "AcDbSpline"<br/> "AcDbARC" "AcDbCircle" "AcDbEllipse"<br/> )<br/> )<br/> (progn<br/> (setq selPoint (cadr ent))<br/> (setq startPoint (vlax-curve-getStartPoint plObj))<br/> (setq endPoint (vlax-curve-getEndPoint plObj))<br/> (if (> (distance selPoint startPoint)<br/> (distance selPoint endPoint)<br/> )<br/> (setq stPoint endPoint<br/> revp T<br/> )<br/> (setq stPoint startPoint<br/> revp nil<br/> )<br/> )<br/> (setvar "OSMODE" 0)<br/> (setq len (- (vlax-curve-getDistAtParam<br/> plObj<br/> (vlax-curve-getendparam plObj)<br/> )<br/> initlen<br/> )<br/> )<br/> (setq num (1+ (fix (/ len interval))))<br/> (setq cnt 0)<br/> (command "undo" "BE")<br/> (while (<= cnt (1- num))<br/> (cond ((= revp nil)<br/> (setq pt (vlax-curve-getPointAtDist<br/> plObj<br/> (+ initlen (* interval cnt))<br/> )<br/> )<br/> (setq firstDeriv<br/> (vlax-curve-getFirstDeriv<br/> plObj<br/> (vlax-curve-getParamAtPoint plObj pt)<br/> )<br/> )<br/> (setq rotang (angle '(0 0 0) firstDeriv))<br/> (command "line"<br/> (polar pt (+ rotang (* 0.5 pi)) (* 0.5 width))<br/> (polar pt (- rotang (* 0.5 pi)) (* 0.5 width))<br/> ""<br/> )<br/> )<br/> ((= revp T)<br/> (setq pt (vlax-curve-getPointAtDist<br/> plObj<br/> (- len (* interval cnt))<br/> )<br/> )<br/> (setq firstDeriv<br/> (vlax-curve-getFirstDeriv<br/> plObj<br/> (vlax-curve-getParamAtPoint plObj pt)<br/> )<br/> )<br/> (setq rotang (angle '(0 0 0) firstDeriv))<br/> (command "line"<br/> (polar pt (+ rotang (* 0.5 pi)) (* 0.5 width))<br/> (polar pt (- rotang (* 0.5 pi)) (* 0.5 width))<br/> ""<br/> )<br/> )<br/> ) ;cond<br/> (setq cnt (1+ cnt))<br/> ) ;while<br/> (command "undo" "E")<br/> ) ;progn<br/> (alert "\Invalid object Selected!")<br/> ) ;endif<br/> (vlax-release-object plObj)<br/> (command "ucs" "p")<br/> (setvar "OSMODE" oldOSMODE)<br/> (princ)<br/>)byghbcx 发表于 2007-4-11 09:23:00
<p>可以改一下,即画即显示,加入比例变量,但怎样在多义线绘制中间能够绘制短线,就是说在命令行显示为:</p><p><font style="BACKGROUND-COLOR: #c4c43c;">指定下一点或 [圆弧(A)/闭合(C)/半宽(H)/长度(L)/放弃(U)/宽度(W)]:</font></p><p><font style="BACKGROUND-COLOR: #ffffff;">的时候能运行程序.</font></p><p>我一时还没想到办法(可以用程序去模拟多义线绘制命令,但这样较复杂点),是否注册一个透明命令?</p><p>(defun C:test (/ scale interval width initlen oldOSMODE<br/> plObj ent pt1 pt2 startPoint endPoint initPoint<br/> revp len interval num cnt<br/> rotang firstDeriv pt stPoint selPoint<br/> )<br/> (setq scale (getreal "\n请输入比例1:<1000>"))<br/> (if (not scale) (setq scale 1000))<br/> (setq interval scale ; 1m<br/> width (* scale 0.5) ; 0.5m<br/> initlen 0 ;????<br/> )<br/> (setq oldOSMODE (getvar "OSMODE"))<br/> (setq cnt 0)<br/> (command "undo" "BE")<br/> (command "ucs" "w")<br/> (vl-load-com)<br/> (setq pt1 (getpoint "\n输入多义线起点"))<br/> (setq pt2 (getpoint pt1 "\n输入多义线顶点(下一点)"))<br/> (while pt2<br/> (command "_.pline" pt1 pt2 "")<br/> (if ent (progn (command "_.pedit" ent "j" (entlast) "" ""))) (setq ent (entlast))<br/> (setq plObj (vlax-ename->vla-object ent<br/>;;; (car<br/>;;; (setq ent (entsel "\nSelect an object: "))<br/>;;; )<br/> )<br/> )<br/> (if (member (vla-get-objectname plObj)<br/> '("AcDbPolyline" "AcDb2dPolyline" "AcDbLine" "AcDbSpline"<br/> "AcDbARC" "AcDbCircle" "AcDbEllipse"<br/> )<br/> )<br/> (progn<br/>;;; (setq selPoint (cdr (assoc 10 (entget ent)))));(cadr ent))<br/> (setq startPoint (vlax-curve-getStartPoint plObj))<br/> (setq endPoint (vlax-curve-getEndPoint plObj))<br/>;;; (if (> (distance selPoint startPoint)<br/>;;; (distance selPoint endPoint)<br/>;;; )<br/>;;; (setq stPoint endPoint<br/>;;; revp T<br/>;;; )<br/> (setq stPoint startPoint<br/> revp nil<br/> )<br/>;;; )<br/> (setvar "OSMODE" 0)<br/> (setq len (- (vlax-curve-getDistAtParam<br/> plObj<br/> (vlax-curve-getendparam plObj)<br/> )<br/> initlen<br/> )<br/> )<br/> (setq num (1+ (fix (/ len interval))))<br/> <br/> (while (<= cnt (1- num))<br/> (cond ((= revp nil)<br/> (setq pt (vlax-curve-getPointAtDist<br/> plObj<br/> (+ initlen (* interval cnt))<br/> )<br/> )<br/> (setq firstDeriv<br/> (vlax-curve-getFirstDeriv<br/> plObj<br/> (vlax-curve-getParamAtPoint plObj pt)<br/> )<br/> )<br/> (setq rotang (angle '(0 0 0) firstDeriv))<br/> (command "line"<br/> (polar pt (+ rotang (* 0.5 pi)) (* 0.5 width))<br/> (polar pt (- rotang (* 0.5 pi)) (* 0.5 width))<br/> ""<br/> )<br/> )<br/> ((= revp T)<br/> (setq pt (vlax-curve-getPointAtDist<br/> plObj<br/> (- len (* interval cnt))<br/> )<br/> )<br/> (setq firstDeriv<br/> (vlax-curve-getFirstDeriv<br/> plObj<br/> (vlax-curve-getParamAtPoint plObj pt)<br/> )<br/> )<br/> (setq rotang (angle '(0 0 0) firstDeriv))<br/> (command "line"<br/> (polar pt (+ rotang (* 0.5 pi)) (* 0.5 width))<br/> (polar pt (- rotang (* 0.5 pi)) (* 0.5 width))<br/> ""<br/> )<br/> )<br/> ) ;cond<br/> (setq cnt (1+ cnt))<br/> ) ;while<br/> <br/> ) ;progn<br/> (alert "\Invalid object Selected!")<br/> ) ;endif<br/> (setq pt1 pt2)<br/> (setq pt2 (getpoint pt1 "\n输入多义线顶点(下一点)"))<br/> )<br/> (vlax-release-object plObj)<br/> (command "ucs" "p")<br/> (command "undo" "E")<br/> (setvar "OSMODE" oldOSMODE)<br/> (princ)<br/>)</p>77077 发表于 2007-4-26 11:31:00
<p>楼上的,我运行了以后发现是以下这个样子哦!</p><p>在转弯的地方就不能在多段线上了!</p><p></p>byghbcx 发表于 2007-4-26 11:35:00
这里没有多段线模拟程序,也就是没有加入弧段的功能,要稍加修改方能实现77077 发表于 2007-4-28 13:50:00
<p>问题是 难者不会,会者不难!</p><p>请楼上的帮忙一下哦!</p>