langjs 发表于 2009-4-27 21:41:00

[原创]一个好用的连续复制程序

<p>;;;__________________________________________<br/>;;; 连续复制<br/>;;;__________________________________________<br/>(defun c:v(/ oce ss p1 p2)<br/>(setq oce(getvar "cmdecho"))<br/>(setvar "cmdecho" 0)<br/>(setq ss (ssget))<br/>(if (null ss) (exit))<br/>(setq p0(getpoint"\n指定基点:"))<br/>(setq p2 p0)<br/>(if (null p0 )(exit))<br/>(princ "\n指定第二点或位移:")<br/>(while t<br/>(setq p1(getpoint p0))<br/>(if (null p1) (mosi11) (mosi12))<br/>)<br/>(princ)<br/>)<br/>(defun mosi12()<br/>(command ".copy" ss "" "m" p2 p1 "")<br/>(setq juli (distance p0 p1))<br/>(setq&nbsp; x0 (car p0))<br/>(setq&nbsp; y0 (cadr p0))<br/>(setq p0 p1)<br/>(setq&nbsp; x1 (car p1))<br/>(setq&nbsp; y1 (cadr p1))<br/>(setq&nbsp; x (- x1 x0))<br/>(setq&nbsp; y (- y1 y0))<br/>(setq&nbsp;&nbsp; hudu(atan y x) )<br/>(setq&nbsp; x1 (+ x0 x))<br/>(setq&nbsp; y1 (+ y0 y))<br/>(setq&nbsp; p1 (list x1 y1 0.0))<br/>(princ (strcat "\n指定下一点或继续位移&lt;" (rtos juli ) "&gt;:"))<br/>)</p><p>(defun mosi11()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq p1 (list (+ (nth 0 p0) (* juli (cos hudu)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (+ (nth 1 p0) (* juli (sin hudu)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (nth 2 p0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>(command ".copy" ss "" "m" p2 p1 "")<br/>(setq juli (distance p0 p1))<br/>(setq p0 p1)<br/>(princ (strcat "\n指定下一点或继续位移&lt;" (rtos juli ) "&gt;:"))<br/>)<br/></p><p>&nbsp;</p>

zmzk 发表于 2022-12-10 09:17:43

;p这个笑脸代表什么啊?程序少东西

langjs 发表于 2009-4-27 21:54:00

<p>再奉献一个程序</p><p>;;;__________________________________________<br/>;;;&nbsp; 文字、数字递增加1复制<br/>;;;__________________________________________<br/>(defun c:MR(/ oce ss p1 p2)<br/>(setq oce(getvar "cmdecho"))<br/>(setvar "cmdecho" 0)<br/>(setq ent (car (entsel "\n递增复制:\n选起始文字:")))<br/>(if (null ent) (exit))<br/>(setq p0(getpoint"\n指定基点:"))<br/>(if (null p0 )(exit))<br/>(princ "\n指定第二点或位移:")<br/>(while t<br/>(setq p1(getpoint p0))<br/>(if (null p1) (mosi111) (mosi112))<br/>)<br/>(princ)<br/>)<br/>(defun mosi112()<br/>(command ".copy" ent "" "m" p0 p1 "")<br/>(setq juli (distance p0 p1))<br/>(setq ent (entlast))<br/>(DS)<br/>(setq&nbsp; x0 (car p0))<br/>(setq&nbsp; y0 (cadr p0))<br/>(setq p0 p1)<br/>(setq&nbsp; x1 (car p1))<br/>(setq&nbsp; y1 (cadr p1))<br/>(setq&nbsp; x (- x1 x0))<br/>(setq&nbsp; y (- y1 y0))<br/>(setq&nbsp;&nbsp; hudu(atan y x) )<br/>(setq&nbsp; x1 (+ x0 x))<br/>(setq&nbsp; y1 (+ y0 y))<br/>(setq&nbsp; p1 (list x1 y1 0.0))<br/>(princ (strcat "\n指定下一点或继续位移&lt;" (rtos juli ) "&gt;:"))<br/>)</p><p>(defun mosi111()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq p1 (list (+ (nth 0 p0) (* juli (cos hudu)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (+ (nth 1 p0) (* juli (sin hudu)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (nth 2 p0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>(command ".copy" ent "" "m" p0 p1 "")<br/>(setq ent (entlast))<br/>(DS)<br/>(setq juli (distance p0 p1))<br/>(setq p0 p1)<br/>(princ (strcat "\n指定下一点或继续位移&lt;" (rtos juli ) "&gt;:"))<br/>)</p><p>(defun DS( )<br/>(setq txt1 (entget ent))<br/>(setq txt1 (cdr (assoc 1 txt1)))<br/>(setq aa (atoi txt1))<br/>(if (and (&gt; aa 0 ) (= (itoa aa) txt1 ) ) (tj120 ) (tj110 ) )<br/>(princ)<br/>)<br/>(defun tj110( / mm zz pp txt2 kk txt3)<br/>(setq mm (strlen txt1))<br/>(setq zz mm )<br/>(while (or (&gt; (atoi (substr txt1 zz )) 0) (= (substr txt1 zz zz ) "0" )) <br/>(setq zz (- zz 1))<br/>)<br/>(setq pp (substr txt1 (+ zz 1) ))<br/>(setq txt2 (substr txt1 1 zz ))<br/>(setq kk (atoi pp) )<br/>(setq kk (+ kk 1 ))<br/>(setq txt3 (strcat txt2 (itoa kk)))<br/>(setq ent (entget ent))<br/>(setq ent (subst (cons 1 txt3 ) (assoc 1 ent) ent) )<br/>(entmod ent)<br/>(setq ent (cdr (assoc -1 ent)))<br/>(princ)<br/>)<br/>(defun tj120 ( / txt2 num txt3)<br/>(setq num 0 )<br/>(setq txt2 (atoi txt1))</p><p>(setq num (+ num 1 ))<br/>(setq txt3 ( + txt2 num) )<br/>(setq ent (entget ent))<br/>(setq ent (subst (cons 1 (itoa txt3) ) (assoc 1 ent) ent) )<br/>(entmod ent)<br/>(setq ent (cdr (assoc -1 ent)))<br/>(princ)<br/>) <br/></p>

ayunger 发表于 2009-4-28 01:40:00

<p>;;;********************************<br/>;;; No.9-2&nbsp; 动态复制 函数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>;;;&nbsp; -By Ayunger Studio 2009.04.27 <br/>;;;********************************<br/>(defun c:ayDCopy (/ SS1 isFirst xAng xDist Pt0 Pt1 Pt2)<br/>&nbsp;(vl-load-com)<br/>&nbsp;(vl-cmdf "_.UNDO" "BE")<br/>&nbsp;(while (not (setq SS1 (ssget))))<br/>&nbsp;(initget 1)<br/>&nbsp;(setq Pt0 (getpoint "\n指定基点: "))<br/>&nbsp;(setq Pt2 Pt0)<br/>&nbsp;<br/>&nbsp;(setq isFirst T)<br/>&nbsp;(while T<br/>&nbsp;&nbsp;(if isFirst<br/>&nbsp;&nbsp;&nbsp;(progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;(initget 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;(setq Pt1 (getpoint Pt2 "\n指定第二点: "))<br/>&nbsp;&nbsp;&nbsp;);end_progn<br/>&nbsp;&nbsp;&nbsp;(setq Pt1 (getpoint Pt2 (strcat "\n指定下一点或位移&lt;" (rtos xDist 2) "&gt;: ")));else<br/>&nbsp;&nbsp;);end_if<br/>&nbsp;&nbsp;(setq isFirst nil)<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;(ayOSMode nil);关闭捕捉.<br/>&nbsp;&nbsp;(if&nbsp;Pt1<br/>&nbsp;&nbsp;&nbsp;(progn;then<br/>&nbsp;&nbsp;&nbsp;&nbsp;(vl-cmdf "_.Copy" SS1 "" "M" Pt0 Pt1 "")<br/>&nbsp;&nbsp;&nbsp;&nbsp;(setq xDist (distance Pt2 Pt1))<br/>&nbsp;&nbsp;&nbsp;&nbsp;(setq xAng (angle Pt2 Pt1))<br/>&nbsp;&nbsp;&nbsp;);end_progn<br/>&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;(progn;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;(setq Pt1 (polar Pt2 xAng xDist))<br/>&nbsp;&nbsp;&nbsp;&nbsp;(vl-cmdf "_.Copy" SS1 "" "M" Pt0 Pt1 "")<br/>&nbsp;&nbsp;&nbsp;);end_progn<br/>&nbsp;&nbsp;);end_if<br/>&nbsp;&nbsp;(ayOSMode T);打开捕捉.<br/>&nbsp;&nbsp;(setq Pt2 Pt1)<br/>&nbsp;);end_while<br/>&nbsp;(vl-cmdf "_.UNDO" "E")<br/>&nbsp;(princ)<br/>);end_defun</p><p>;;;**************************<br/>;;; No.0 对象捕捉开关 函数&nbsp;&nbsp; <br/>;;;**************************<br/>(defun ayOSMode (isOpenSnap)<br/>&nbsp;(if isOpenSnap<br/>&nbsp;&nbsp;(setvar "osmode" (rem (getvar "osmode") 16384));打开捕捉.<br/>&nbsp;&nbsp;(setvar "osmode" (+ (rem (getvar "osmode") 16384) 16384));关闭捕捉.<br/>&nbsp;);end_if<br/>);end_defun<br/></p>

langjs 发表于 2009-4-28 09:00:00

感谢楼上指点,比我编的好多了。另外如果程序能象普通的复制那样显示拖动效果就更好了,小弟入行浅,想了好久也不知道怎么达到拖动效果,可否指点一二?

AMTONNY 发表于 2009-4-28 22:18:00

<p>看偶调用原命令</p><p>(defun c:CC ()<br/>&nbsp; (setvar "cmdecho" 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (princ "\n---&gt;&gt;&gt;连续复制")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ SS(SSGET))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "_.copy" ss "" "m") (princ))</p>

langjs 发表于 2009-4-29 17:16:00

本帖最后由 langjs 于 2011-12-24 22:54 编辑 <br /><br /><P>修改一下,象普通复制那样带拖动效果了。编的有点乱,莫见笑。</P>
<P>;;; __________________________________________<BR>;;; 连续复制&nbsp;&nbsp;&nbsp;&nbsp; langjs 2009.4.29<BR>;;; __________________________________________<BR>(defun c:lxfz ( / ennn hudu juli julibak oce p0 p1 ss ssbak)<BR>&nbsp; (setq oce (getvar "cmdecho"))<BR>&nbsp; (setvar "cmdecho" 0)<BR>&nbsp; (vl-load-com)<BR>&nbsp; (setq ss (ssget))<BR>&nbsp; (if (null ss)<BR>&nbsp;&nbsp;&nbsp; (vl-exit-with-error "")<BR>&nbsp; )<BR>&nbsp; (setq p0 (getpoint "\n指定基点:"))<BR>&nbsp; (if (null p0)<BR>&nbsp;&nbsp;&nbsp; (vl-exit-with-error "")<BR>&nbsp; )<BR>&nbsp; (princ "\n指定第二点, 或位移:")<BR>&nbsp; (while t<BR>&nbsp;&nbsp;&nbsp; (command ".UNDO" "BE")<BR>&nbsp;&nbsp;&nbsp; (setq ennn (entlast))<BR>&nbsp;&nbsp;&nbsp; (command ".copy" ss "" p0 pause)<BR>&nbsp;&nbsp;&nbsp; (setq p1 (getvar "lastpoint"))<BR>&nbsp;&nbsp;&nbsp; (setq ss (lt:ss-entnext ennn))<BR>&nbsp;&nbsp;&nbsp; (setq juli (distance p0 p1))<BR>&nbsp;&nbsp;&nbsp; (if (= 0 juli)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;(command ".erase" ss "")<BR>&nbsp;(setq ss ssbak)<BR>&nbsp;(setq p1 (list (+ (nth 0 p0) (* julibak (cos hudu))) (+ (nth 1 p0) (* julibak (sin hudu))) (nth 2 p0)))<BR>&nbsp;(setq ennn (entlast))<BR>&nbsp;(command ".copy" ss "" p0 p1)<BR>&nbsp;(setq ss (lt:ss-entnext ennn))<BR>&nbsp;(setq ssbak ss)<BR>&nbsp;(setq p0 p1)<BR>&nbsp;(princ (strcat "\n指定下一点, 或继续位移&lt;" (rtos julibak) "&gt;:"))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;(setq ssbak ss)<BR>&nbsp;(setq julibak juli)<BR>&nbsp;(setq hudu (angle p0 p1))<BR>&nbsp;(princ)<BR>&nbsp;(setq p0 p1)<BR>&nbsp;(princ (strcat "\n指定下一点, 或继续位移&lt;" (rtos julibak) "&gt;:"))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; (command ".UNDO" "E")<BR>&nbsp;&nbsp;&nbsp; (princ)<BR>&nbsp; )<BR>&nbsp; (princ)<BR>)<BR>;;; _____________________________________________________________<BR>;;; ▓ (lt:ss-entnext en)<BR>;;; [功能] 获取在图元 en 之后产生的图元的选择集<BR>;;; [参数] en----图元名<BR>;;; [返回] 选择集<BR>;;; [测试]1.(setq en (entlast))<BR>;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行创建图元的命令,如 line,boundary<BR>;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ss (lt:ss-entnext en))<BR>;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.(setq ss (lt:ss-entnext (car(entsel))))<BR>(defun lt:ss-entnext (en / ss)<BR>&nbsp; (if en<BR>&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ss (ssadd))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (while (setq en (entnext en))<BR>&nbsp;(if (not (member (cdr (assoc 0 (entget en))) '("ATTRIB" "VERTEX"<BR>&nbsp;&nbsp;&nbsp;&nbsp; "SEQEND"<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp; (ssadd en ss)<BR>&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (zerop (sslength ss))<BR>&nbsp;(setq ss nil)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ss<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; (ssget "_x")<BR>&nbsp; )<BR>)<BR></P>
<P></P>
<P></P>

userzhl 发表于 2009-4-29 18:10:00

<p>结束处理得不好.最好可以这样:接空格就结束,按右键才继续复制.</p>

langjs 发表于 2009-4-30 11:59:00

<p>有时候点击快了,拷贝的位置出现错误,不知哪位老大能指点指点迷津?</p>

caoyin 发表于 2009-5-1 09:03:00

<p>指定下一点, 或继续位移&lt;1568.5362&gt;:<br/>未知命令“V”。按 F1 查看帮助。</p><p>程序运行有点慢哦,而且还有错误</p>

lzj511 发表于 2009-5-7 21:29:00

<p>CAD2008里面的copy本身就可以连续复制啊!!</p>
页: [1] 2
查看完整版本: [原创]一个好用的连续复制程序