明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2573|回复: 7

[求助]如何一次提取所有选取的圆的圆心坐标?

[复制链接]
发表于 2007-5-7 12:54 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2007-5-7 12:55:28 编辑

如何一次提取所有选取的圆的圆心坐标?

电子图上有1300根桩,如何一次提取他们圆心的坐标值啊,谢谢。在线等,qq:49995529

发表于 2007-5-7 14:29 | 显示全部楼层

就是取出所有圆的DXF组码的10, 就是圆心坐标喽.

刚写一个请参考:


;;;时间2007-05-07
;;;编程:BDYCAD
(defun c:test(/ CENTERPOINT DXF ENAME I SS SSL)
  (princ"\n请选择要取圆心坐标的圆:")
  (setq ss(ssget))
  (if ss
    (progn
      (setq i 0 ssl (sslength ss))
      (repeat ssl
 (setq ename(ssname ss i))
 (setq dxf(entget ename))
 (setq CenterPoint(cdr(assoc 10 dxf)))
 (princ(strcat"\n第 "(rtos i)" 个圆的坐标点是:"))
 (princ CenterPoint)
 (setq i(1+ i))
 )
      )
    (princ"\n没有选到圆圈,请再试一次.")
    )
  (princ)
  )

发表于 2007-5-7 15:52 | 显示全部楼层
本帖最后由 作者 于 2007-5-8 9:50:28 编辑

2楼是LISP代码,下面这是采用VBA的方式。请对比。
  1. Sub ctoe()
  2. Dim rownum As Integer
  3. Dim Found As Boolean
  4. Dim MyObject As AcadEntity
  5. rownum = 2
  6. Found = False
  7. For Each MyObject In ThisDrawing.ModelSpace               '在模型空间中遍历所有的图元
  8.         If StrComp(MyObject.EntityName, "acdbcircle", 1) = 0 Then '这一句是判断对象是否是圆
  9.                
  10.                 If rownum = 2 Then '若是圆对象
  11.                         Dim Excel As Excel.Application
  12.                         Dim ExcelWorkbook As Object
  13.                         Dim ExcelSheet As Object
  14.                         Set Excel = New Excel.Application '启动EXCEL
  15.                         Set ExcelWorkbook = Excel.Workbooks.Add
  16.                         Set ExcelSheet = Excel.ActiveSheet
  17.                         'Excel.Visible = True   '显示EXCEL
  18.                         Dim pt '(0 To 2)   '定义数组变量,存储圆心坐标
  19.                 End If
  20.                
  21.                 pt = MyObject.Center
  22.                 ExcelSheet.Cells(rownum, 1) = "编号待定"
  23.                 ExcelSheet.Cells(rownum, 2) = pt(0)                '圆心坐标X值
  24.                 ExcelSheet.Cells(rownum, 3) = pt(1)                '圆心坐标Y值
  25.                 ExcelSheet.Cells(rownum, 4) = pt(2)                '圆心坐标Z值
  26.                 rownum = rownum + 1
  27.                 Found = True '将标记设成 True。
  28.         End If '结束IF
  29. Next MyObject '遍历下一个对象
  30. If Found = True Then
  31.         ExcelSheet.Cells(1, 1) = "编号"
  32.         ExcelSheet.Cells(1, 2) = "X"
  33.         ExcelSheet.Cells(1, 3) = "Y"
  34.         ExcelSheet.Cells(1, 4) = "Z"
  35.         MsgBox "圆心坐标输出完毕,请检阅!"
  36.         Excel.Visible = True   '显示EXCEL
  37.         Set ExcelSheet = Nothing
  38.         Set ExcelWorkbook = Nothing
  39.         Set Excel = Nothing
  40. Else
  41.         MsgBox "在当前模型空间中未找到圆对象!"
  42. End If
  43. End Sub
更多讨论见:
http://p4.xdcad.net/forum/showthread.php?s=&postid=3113742#post3113742
思路在3楼,代码在5楼。
发表于 2007-7-24 22:41 | 显示全部楼层
如何把圆心坐标中的括号去除,"把第*个圆的坐标点是:"改为只显示序号,还有能把这些点存成TXT文件就更好了.
发表于 2007-7-31 09:10 | 显示全部楼层

楼主是学测量的吧,我也常要解决此类问题,不过为每个圆心编上编号,再用程序向EXCEL输出坐标文件不是更好.输出程序见下

(defun c:lytzbsc()
;;; 在图中向文件E:\\123\\2.xls输出选中字体角点坐标程序
  (VL-LOAD-COM)
  (setq AcadObject(vlax-get-acad-object)
        AcadDocument(vla-get-ActiveDocument AcadObject)
        mSpace(vla-get-ModelSpace AcadDocument)
  )
  (setq fp1(open "E:\\123\\2.xls" "w"))
  (setq p1(getpoint "\n请输入第一点:"))
  (setq p2(getpoint "\n请输入第二点:"))
  (setq ss(ssget "W" P1 p2))
  (SETQ t1 "text=")
  (setq a1 0)
  (setq tt1(cdr(assoc 1 (entget(ssname ss a1)))))
  (setq d1(cdr(assoc 10 (entget(ssname ss a1)))))
  (princ "\t" fp1)  (princ tt1 fp1)
  (princ "\t" fp1)  (princ "x=" fp1) 
    (princ "\t" fp1)  (princ (cadr d1) fp1)
   (princ "\t" fp1)  (princ "y=" fp1)
  (princ "\t" fp1)  (princ (car d1) fp1)
  (while  (ssname ss (+ a1 1))
    (setq a1 (+ a1 1))
    (setq tt1 (cdr (assoc 1 (entget(ssname ss a1)))))
     (setq d1 (cdr (assoc 10 (entget(ssname ss a1)))))
    (print t1 fp1)
      (princ "\t" fp1)  (princ tt1 fp1)
  (princ "\t" fp1)  (princ "x=" fp1)
       (princ "\t" fp1)  (princ (cadr d1) fp1)
   (princ "\t" fp1)  (princ "y=" fp1)
  (princ "\t" fp1)  (princ (car d1) fp1)
    )
  (close fp1)
 
 )

发表于 2007-9-19 01:19 | 显示全部楼层

二楼的程序若坐标值超过7位数时,输出的是科学记数法。

如:第 1.0000 个圆的坐标点是:(208948.0 1.59701e+006 0.0)。

能否修改完善。

发表于 2007-9-19 04:17 | 显示全部楼层

如果楼主是搞测量的话,我想给几点建议:

 1 你所说的1300根桩,如果要加桩号的话,最好是放在扩展数据里,以后注记、删除、查找桩号很方便,只要读出扩展数据就可以了;

 2 编程取坐标可用多段线圈选的方法,这样更灵活;

 3 生成的坐标数据用文本格式更方便交流,比如说要传入全站仪就很方便了。

  以上建议仅供你的参考。

发表于 2007-9-19 08:35 | 显示全部楼层
  1. 若坐标值超过7位数时,输出的是科学记数法 ....
复制代码
;(princ CenterPoint)
==>
(setq  prec 8 )            ; 精度可以到 (共16位)
(princ (rtos (car CenterPoint) 2 prec))    ; x
(princ " ")
(princ (rtos (cadr CenterPoint) 2 prec))   ; y
(princ " ")
(princ (rtos (caddr CenterPoint) 2 prec))  ; z
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-20 03:02 , Processed in 0.210335 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表