[求助]怎么提取圆心坐标?
<p>(defun c:ccord ()<br/> (setq ss (ssget))<br/> (setq n 0)<br/> (repeat (sslength ss)<br/> (setq en (ssname ss n ))<br/> (setq en_data (entget en))<br/> (setq cen_data (cdr (assoc 10 en_data)))<br/> (setq n (1+ n))<br/> )<br/> (sub_write_data) <br/> (prin1)<br/>)</p><p>(defun sub_write_data ()<br/> (setq data_file (getfiled "写入坐标文件" "c:\\lsptools\\" "dat" 1))<br/> (setq ff (open data_file "w"))<br/> (write-line "对象名称 坐标尺寸" ff)<br/> (write-line "---------------------" ff)<br/> (write-line (itoa cen_data) ff)<br/> (close ff)<br/> (prin1)<br/> )<br/>(prompt "<<CCORD>>圆心提取程序")<br/>(prin1)</p><p> <br/> <br/> </p> 大家帮忙看一下! <p>1.既然你的程序是提取圆心坐标,那么在选择的时候就应该把非圆图元过滤掉,这样可以减少运算量,提高程序的效率<br/> 所以建议把(setq ss (ssget))改成(setq ss (ssget '((0 . "CIRCLE"))))</p><p>2.你现在的程序最多也只是把最后一个圆的圆心坐标写入数据文件。如果你是想每得到一个圆心坐标就写一次的话,应该把write-line放进循环;这个时候文件的打开应该是"a"的方式,而不是"w";如果你想提取所有圆心坐标再一次写入的话,应该在循环前创建一个变量来存放圆心坐标。待循环完毕再一次写入,这个时候文件的打开方式可以是"a",也可以是"w".</p><p>3.你要知道cen_data得到的是什么类型的数据,是一个包含圆心XYZ数值的表,而write-line接受的是字符串.如果你不会转换或不想转换,可以考虑用princ写入</p>(defun c:ccord ()
(if (setq data_file (getfiled "写入坐标文件" "c:\\lsptools\\" "dat" 1))
(if (setq ss (ssget '((0 . "CIRCLE")))) (progn
(setq ff (open data_file "w"))
(write-line "对象名称 坐标尺寸" ff)
(write-line "---------------------" ff)
(setq n 0)
(repeat (sslength ss)
(setq en (ssname ss n ))
(setq en_data (entget en))
(setq cen_data (cdr (assoc 10 en_data)))
(setq n (1+ n))
(princ en ff) (princ " " ff) (princ cen_data ff) (princ "\n" ff)
)
(close f)
))
))
(prin1)
)
(prompt "<<CCORD>>圆心提取程序")
(prin1)
谢谢指点!明天我试一下! <p>看看版主的!呵呵1</p> <p>学习了.</p><p></p> <p>如何输出(12345678.21 45678941.25 0.00)而不是(1.23456e+007 4.56789e+007 0.00)</p> <p>(princ (strcat "(" (rtos (car cen_data) 2 2) " " (rtos (cadr cen_data) 2 2) " " (rtos (last cen_data) 2 2) ")"))</p><p>注意:变量DIMZIN要事先设成零。不然有可能小数点后有可能无零。</p> <p>图中实际坐标(12345678.21 45678941.25 0.00)</p><p>"rtos"后变为</p><p>(1.23456e+007 4.56789e+007 0.00)既有效为6位了原为10位的问题</p><p>能否输出字符为"12345678.21"为10位有效数</p>