魔域狂龙 发表于 2005-7-19 19:00:00

样条曲线可以传换成圆孤的吗

本帖最后由 作者 于 2005-7-20 19:19:03 编辑

样条曲线可以传换成圆孤的吗。。怎样设置才可以。那位高手帮我写一个LISP程序。传换成圆孤不要太少。。孤长3。4MM都可以。。主要的是传换回的精度。圆孤要跟原来的样条曲线对得上。精度不能大于0。01MM。我在此先多谢先

21208804 发表于 2005-7-20 17:06:00

<P><STRONG>问:::????vb中多义线如何拟合?</STRONG></P>

魔域狂龙 发表于 2005-7-20 19:29:00

<P>怎么没有帮帮我这个忙啊。。</P>
<P>在CAD里另存为R12格式可以把SPL传换回PL。但是传换过来都是直线了。是圆孤的地方也是直线。有什么办法可以把传换回来的PL有圆孤的地方是圆孤。直线的是直线。怎样设置或有什么程序可以的吗。</P>

torcky 发表于 2005-7-21 09:52:00

<P>我以前编写过类似的程序但有点问题,另现在网吧不让上传</P>
<P>我把我的思路说一下吧,希望对你有所帮助:用vlax-curve-***函数获得spline的startpoint和endpoint,以及spline线上指定长度的点(我是将spline线等分n份;n越大精度越高run越慢);然后循环在spline线上以三点画arc,直到完成。</P>
<P>几点注意:1.在比较尖锐的地方要缩小spline线上指定长度的点;2.当spline很平直时不能用arc只能用line;3.垂直和水平的spline部分要注意。</P>
<P>&nbsp;</P>

魔域狂龙 发表于 2005-7-21 15:38:00

<P>多谢楼上。。我对这个不懂啊。。能不能帮我帮到底。帮我写一个。在此先多谢先</P>

HuaiYu 发表于 2005-7-22 21:21:00

<P>(defun c:t1 (/ en dist length-en nn vl-en vl-en old_osmode)<BR>&nbsp; (vl-load-com)<BR>&nbsp; (setq&nbsp;*acadobject*&nbsp;&nbsp; (vlax-get-acad-object)<BR>&nbsp;*acaddocument* (vla-get-activedocument *acadobject*)<BR>&nbsp;*mspace*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-get-modelspace *acaddocument*)<BR>&nbsp; ) ;_ endsetq</P>
<P>&nbsp; (setq en (car (entsel "please select a spline: ")))<BR>&nbsp; (if (null en)<BR>&nbsp;&nbsp;&nbsp; (exit)<BR>&nbsp; ) ;_ endif<BR>&nbsp; (setq dist (getreal "please input the distance that you want: "))<BR>&nbsp; (if (null dist)<BR>&nbsp;&nbsp;&nbsp; (setq dist 1)<BR>&nbsp; ) ;_ endif<BR>&nbsp; (vla-startundomark *acadDocument*)<BR>&nbsp; (command "lengthen" en "")<BR>&nbsp; (setq&nbsp;ss1&nbsp;&nbsp;&nbsp;&nbsp; (ssadd)<BR>&nbsp;old-osmode&nbsp; (getvar "osmode")<BR>&nbsp;old-cmdecho (getvar "cmdecho")<BR>&nbsp;length-en&nbsp;&nbsp; (getvar "perimeter")<BR>&nbsp;nn&nbsp;&nbsp;&nbsp;&nbsp; (fix (/ length-en dist))<BR>&nbsp;i&nbsp;&nbsp;&nbsp;&nbsp; 0<BR>&nbsp;vl-en&nbsp;&nbsp;&nbsp;&nbsp; (vlax-ename-&gt;vla-object en)<BR>&nbsp;c&nbsp;&nbsp;&nbsp;&nbsp; (ssadd)<BR>&nbsp;pt-end&nbsp;&nbsp;&nbsp;&nbsp; (cdr (last (entget en)))<BR>&nbsp; ) ;_ Endsetq<BR>&nbsp; (if (&lt; length-en dist)<BR>&nbsp;&nbsp;&nbsp; (exit)<BR>&nbsp; ) ;_ Endif<BR>&nbsp; (setvar "osmode" 0)<BR>&nbsp; (setvar "cmdecho" 0)<BR>&nbsp; (repeat nn<BR>&nbsp;&nbsp;&nbsp; (setq pt0 (vlax-curve-getpointatdist vl-en (* (+ i 0) dist))<BR>&nbsp;&nbsp; pt1 (vlax-curve-getpointatdist vl-en (* (+ i 1) dist))<BR>&nbsp;&nbsp; i&nbsp;&nbsp; (1+ i)<BR>&nbsp;&nbsp;&nbsp; ) ;_ Endsetq<BR>&nbsp;&nbsp;&nbsp; (command "line" pt0 pt1 "")<BR>&nbsp;&nbsp;&nbsp; (ssadd (entlast) ss1)<BR>&nbsp; ) ;_ Endrepeat<BR>&nbsp; (command "line" pt1 pt-end "")<BR>&nbsp; (command "pedit" (entlast) "y" "j" ss1 "" "")<BR>&nbsp; (setvar "osmode" old-osmode)<BR>&nbsp; (setvar "cmdecho" old-cmdecho)<BR>&nbsp; (vla-endundomark *acadDocument*)<BR>) ;_ enddefun<BR></P>

HuaiYu 发表于 2005-7-22 21:23:00

<P>看能不能起一点抛砖引玉的作用了</P>
<P>,另请 torcky 批评指正</P>

torcky 发表于 2005-7-25 16:47:00

<P><A name=46883><FONT color=#000066><B>HuaiYu</B></FONT></A>,你太谦虚了。</P>
<P>你是用短直线代替spline,这样还比较简单。</P>
<P>&nbsp;</P>

torcky 发表于 2005-7-26 13:20:00

<P>;;;这是俺好久以前写的,供各位参考</P>
<P>(defun c:cr ()<BR>&nbsp; (vl-load-com)<BR>&nbsp; (command "undo" "be")<BR>&nbsp; (command "ucs" "w")<BR>&nbsp; (setvar "cmdecho" 0)<BR>&nbsp; (setq oldpara1 (getvar "orthomode") oldpara2 (getvar "osmode"))<BR>&nbsp; (setvar "orthomode" 0 )<BR>&nbsp; (setvar&nbsp; "osmode" 0)<BR>&nbsp; (setq entname (car(entsel "\nSelect Curve:")))<BR>&nbsp; (setq precision(getreal "\nEnter Precision Factor&lt;1&gt;:"))<BR>&nbsp; (command "area" "e" entname)<BR>&nbsp; (setq curve-long (getvar "perimeter"))<BR>&nbsp; (if (= precision nil)<BR>&nbsp;&nbsp;&nbsp; (setq facter 0.5)<BR>&nbsp;&nbsp;&nbsp; (setq facter (/ 0.5 precision)))<BR>&nbsp; (setq re (rem curve-long facter))<BR>&nbsp; (setq i (/ (- curve-long re)facter))<BR>&nbsp; (setq j 0)<BR>&nbsp; (setq arc (ssadd))<BR>&nbsp; (setq vla-curve(vlax-ename-&gt;vla-object entname))<BR>&nbsp; (setq st-point(vlax-curve-getStartPoint vla-curve))<BR>&nbsp; (while (&lt; j i)<BR>&nbsp;&nbsp;&nbsp; (setq mid-point(vlax-curve-getPointAtDist vla-curve (+ (/ facter 2.0) (* facter j))))<BR>&nbsp;&nbsp;&nbsp; (setq end-point(vlax-curve-getPointAtDist vla-curve (+ facter (* facter j))))<BR>&nbsp;&nbsp;&nbsp; (slope)<BR>&nbsp;&nbsp;&nbsp; (cond<BR>&nbsp;((= flags 0) (command "line" st-point end-point ""))<BR>&nbsp;((= flags 1) (command "arc" st-point mid-point end-point))<BR>&nbsp;((= flags 2) (progn<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq mid-point(vlax-curve-getPointAtDist vla-curve (+ (/ facter 8.0) (* facter j))))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq end-point(vlax-curve-getPointAtDist vla-curve (+ (/ facter 4.0) (* facter j))))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "arc" st-point mid-point end-point))))<BR>&nbsp;&nbsp;&nbsp; (setq arc (ssadd (entlast) arc))<BR>&nbsp;&nbsp;&nbsp; (setq st-point end-point)<BR>&nbsp;&nbsp;&nbsp; (setq j(1+ j))<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp; (if (&gt; re 0)<BR>&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq re2 (/ re 2.0))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq mid-point(vlax-curve-getPointAtDist vla-curve (+ re2(+ facter (* facter (- j 1))))))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq end-point(vlax-curve-getEndPoint vla-curve))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (slope)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cond<BR>&nbsp;((= flags 0) (command "line" st-point end-point ""))<BR>&nbsp;((= flags 1) (command "arc" st-point mid-point end-point)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq arc (ssadd (entlast) arc))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (princ)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp; (command "pedit" (entlast)&nbsp; "y"&nbsp; "j" arc "" "")<BR>&nbsp; (setvar "orthomode" oldpara1 )<BR>&nbsp; (setvar&nbsp; "osmode" oldpara2)<BR>&nbsp; (command "undo" "e")<BR>&nbsp; (prompt "\n*****Designer of CurveToArc V1.0 Is Tang.J.Z.*****")<BR>&nbsp; (princ)<BR>&nbsp; )<BR>(defun slope()<BR>&nbsp; (setq st-point-x(car st-point))<BR>&nbsp; (setq st-point-y(cadr st-point))<BR>&nbsp; (setq mid-point-x(car mid-point))<BR>&nbsp; (setq mid-point-y(cadr mid-point))<BR>&nbsp; (setq end-point-x(car end-point))<BR>&nbsp; (setq end-point-y(cadr end-point))<BR>&nbsp; (cond<BR>&nbsp;&nbsp;&nbsp; ((and (= st-point-y mid-point-y)(/= end-point-y mid-point-y)) (setq flags 1))<BR>&nbsp;&nbsp;&nbsp; ((and (/= st-point-y mid-point-y)(= end-point-y mid-point-y)) (setq flags 1))<BR>&nbsp;&nbsp;&nbsp; ((and (/= st-point-y mid-point-y)(/= end-point-y mid-point-y))<BR>&nbsp;&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq slope-st(/(- mid-point-x st-point-x)(- mid-point-y st-point-y)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq slope-end(/(- end-point-x mid-point-x )(- end-point-y mid-point-y )))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq flags 1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (&lt;= (abs (- slope-st slope-end)) 0.0005)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq flags 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (&gt;= (abs (- slope-st slope-end)) 0.5)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq flags 2)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; ((and (= st-point-y mid-point-y)(= end-point-y mid-point-y)) (setq flags 0))<BR>&nbsp;&nbsp;&nbsp; )<BR>)</P>

xyp1964 发表于 2005-7-26 20:39:00

<P>变什么都行!</P>
<P></P>
页: [1] 2
查看完整版本: 样条曲线可以传换成圆孤的吗