[原创]一个好用的连续复制程序
<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 x0 (car p0))<br/>(setq y0 (cadr p0))<br/>(setq p0 p1)<br/>(setq x1 (car p1))<br/>(setq y1 (cadr p1))<br/>(setq x (- x1 x0))<br/>(setq y (- y1 y0))<br/>(setq hudu(atan y x) )<br/>(setq x1 (+ x0 x))<br/>(setq y1 (+ y0 y))<br/>(setq p1 (list x1 y1 0.0))<br/>(princ (strcat "\n指定下一点或继续位移<" (rtos juli ) ">:"))<br/>)</p><p>(defun mosi11()<br/> (setq p1 (list (+ (nth 0 p0) (* juli (cos hudu)))<br/> (+ (nth 1 p0) (* juli (sin hudu)))<br/> (nth 2 p0)<br/> )<br/> )<br/>(command ".copy" ss "" "m" p2 p1 "")<br/>(setq juli (distance p0 p1))<br/>(setq p0 p1)<br/>(princ (strcat "\n指定下一点或继续位移<" (rtos juli ) ">:"))<br/>)<br/></p><p> </p> ;p这个笑脸代表什么啊?程序少东西 <p>再奉献一个程序</p><p>;;;__________________________________________<br/>;;; 文字、数字递增加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 x0 (car p0))<br/>(setq y0 (cadr p0))<br/>(setq p0 p1)<br/>(setq x1 (car p1))<br/>(setq y1 (cadr p1))<br/>(setq x (- x1 x0))<br/>(setq y (- y1 y0))<br/>(setq hudu(atan y x) )<br/>(setq x1 (+ x0 x))<br/>(setq y1 (+ y0 y))<br/>(setq p1 (list x1 y1 0.0))<br/>(princ (strcat "\n指定下一点或继续位移<" (rtos juli ) ">:"))<br/>)</p><p>(defun mosi111()<br/> (setq p1 (list (+ (nth 0 p0) (* juli (cos hudu)))<br/> (+ (nth 1 p0) (* juli (sin hudu)))<br/> (nth 2 p0)<br/> )<br/> )<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指定下一点或继续位移<" (rtos juli ) ">:"))<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 (> 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 (> (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> <p>;;;********************************<br/>;;; No.9-2 动态复制 函数 <br/>;;; -By Ayunger Studio 2009.04.27 <br/>;;;********************************<br/>(defun c:ayDCopy (/ SS1 isFirst xAng xDist Pt0 Pt1 Pt2)<br/> (vl-load-com)<br/> (vl-cmdf "_.UNDO" "BE")<br/> (while (not (setq SS1 (ssget))))<br/> (initget 1)<br/> (setq Pt0 (getpoint "\n指定基点: "))<br/> (setq Pt2 Pt0)<br/> <br/> (setq isFirst T)<br/> (while T<br/> (if isFirst<br/> (progn<br/> (initget 1)<br/> (setq Pt1 (getpoint Pt2 "\n指定第二点: "))<br/> );end_progn<br/> (setq Pt1 (getpoint Pt2 (strcat "\n指定下一点或位移<" (rtos xDist 2) ">: ")));else<br/> );end_if<br/> (setq isFirst nil)<br/> <br/> (ayOSMode nil);关闭捕捉.<br/> (if Pt1<br/> (progn;then<br/> (vl-cmdf "_.Copy" SS1 "" "M" Pt0 Pt1 "")<br/> (setq xDist (distance Pt2 Pt1))<br/> (setq xAng (angle Pt2 Pt1))<br/> );end_progn<br/> <br/> (progn;else<br/> (setq Pt1 (polar Pt2 xAng xDist))<br/> (vl-cmdf "_.Copy" SS1 "" "M" Pt0 Pt1 "")<br/> );end_progn<br/> );end_if<br/> (ayOSMode T);打开捕捉.<br/> (setq Pt2 Pt1)<br/> );end_while<br/> (vl-cmdf "_.UNDO" "E")<br/> (princ)<br/>);end_defun</p><p>;;;**************************<br/>;;; No.0 对象捕捉开关 函数 <br/>;;;**************************<br/>(defun ayOSMode (isOpenSnap)<br/> (if isOpenSnap<br/> (setvar "osmode" (rem (getvar "osmode") 16384));打开捕捉.<br/> (setvar "osmode" (+ (rem (getvar "osmode") 16384) 16384));关闭捕捉.<br/> );end_if<br/>);end_defun<br/></p> 感谢楼上指点,比我编的好多了。另外如果程序能象普通的复制那样显示拖动效果就更好了,小弟入行浅,想了好久也不知道怎么达到拖动效果,可否指点一二? <p>看偶调用原命令</p><p>(defun c:CC ()<br/> (setvar "cmdecho" 0)<br/> (princ "\n--->>>连续复制")<br/> (SETQ SS(SSGET))<br/> (command "_.copy" ss "" "m") (princ))</p> 本帖最后由 langjs 于 2011-12-24 22:54 编辑 <br /><br /><P>修改一下,象普通复制那样带拖动效果了。编的有点乱,莫见笑。</P><P>;;; __________________________________________<BR>;;; 连续复制 langjs 2009.4.29<BR>;;; __________________________________________<BR>(defun c:lxfz ( / ennn hudu juli julibak oce p0 p1 ss ssbak)<BR> (setq oce (getvar "cmdecho"))<BR> (setvar "cmdecho" 0)<BR> (vl-load-com)<BR> (setq ss (ssget))<BR> (if (null ss)<BR> (vl-exit-with-error "")<BR> )<BR> (setq p0 (getpoint "\n指定基点:"))<BR> (if (null p0)<BR> (vl-exit-with-error "")<BR> )<BR> (princ "\n指定第二点, 或位移:")<BR> (while t<BR> (command ".UNDO" "BE")<BR> (setq ennn (entlast))<BR> (command ".copy" ss "" p0 pause)<BR> (setq p1 (getvar "lastpoint"))<BR> (setq ss (lt:ss-entnext ennn))<BR> (setq juli (distance p0 p1))<BR> (if (= 0 juli)<BR> (progn<BR> (command ".erase" ss "")<BR> (setq ss ssbak)<BR> (setq p1 (list (+ (nth 0 p0) (* julibak (cos hudu))) (+ (nth 1 p0) (* julibak (sin hudu))) (nth 2 p0)))<BR> (setq ennn (entlast))<BR> (command ".copy" ss "" p0 p1)<BR> (setq ss (lt:ss-entnext ennn))<BR> (setq ssbak ss)<BR> (setq p0 p1)<BR> (princ (strcat "\n指定下一点, 或继续位移<" (rtos julibak) ">:"))<BR> )<BR> (progn<BR> (setq ssbak ss)<BR> (setq julibak juli)<BR> (setq hudu (angle p0 p1))<BR> (princ)<BR> (setq p0 p1)<BR> (princ (strcat "\n指定下一点, 或继续位移<" (rtos julibak) ">:"))<BR> )<BR> )<BR> (command ".UNDO" "E")<BR> (princ)<BR> )<BR> (princ)<BR>)<BR>;;; _____________________________________________________________<BR>;;; ▓ (lt:ss-entnext en)<BR>;;; [功能] 获取在图元 en 之后产生的图元的选择集<BR>;;; [参数] en----图元名<BR>;;; [返回] 选择集<BR>;;; [测试]1.(setq en (entlast))<BR>;;; 执行创建图元的命令,如 line,boundary<BR>;;; (setq ss (lt:ss-entnext en))<BR>;;; 2.(setq ss (lt:ss-entnext (car(entsel))))<BR>(defun lt:ss-entnext (en / ss)<BR> (if en<BR> (progn<BR> (setq ss (ssadd))<BR> (while (setq en (entnext en))<BR> (if (not (member (cdr (assoc 0 (entget en))) '("ATTRIB" "VERTEX"<BR> "SEQEND"<BR> )<BR> )<BR> )<BR> (ssadd en ss)<BR> )<BR> )<BR> (if (zerop (sslength ss))<BR> (setq ss nil)<BR> )<BR> ss<BR> )<BR> (ssget "_x")<BR> )<BR>)<BR></P>
<P></P>
<P></P> <p>结束处理得不好.最好可以这样:接空格就结束,按右键才继续复制.</p> <p>有时候点击快了,拷贝的位置出现错误,不知哪位老大能指点指点迷津?</p> <p>指定下一点, 或继续位移<1568.5362>:<br/>未知命令“V”。按 F1 查看帮助。</p><p>程序运行有点慢哦,而且还有错误</p> <p>CAD2008里面的copy本身就可以连续复制啊!!</p>
页:
[1]
2