找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 440|回复: 5

[求助]:模仿TSSD1.7的表格编程,遇到了问题

[复制链接]
发表于 2003-12-1 16:27:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
大家好,我刚接触CAD二次开发,模仿TSSD1.7,用delphi编了一个表格程序,遇到一些问题,请大家指教!如下图,如果要在表格里任意一个单元格点击,便可输入文字,但如何使输入的文字自动在各自的单元格里居中,也就是说怎样找出每个单元格的中心点??
象TSSD1.7一样
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-12-1 19:30:59 | 显示全部楼层
单元格的中心点应该由它外围的直线来定的,因而转化为求直线,可以使用射线法,即往四个方向各做一条射线,最先与它相交的就是所求的直线,然后求出它们的交点,交点一确定,中心点也就出来了。
还要一种方法是使用Boundry,求出包含点的外围,但是要用到ACAD的内部命令。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-5 15:49:46 | 显示全部楼层
请班长讲下射线法的方法好吗      ??
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-5 22:25:30 | 显示全部楼层
是啊,版主能将用例子现场教学一下吗?求单元格的中心点,我按您的提示,想了好几天,一直没有眉目,还请版主大人赐教!!!这种方法如果掌握了,我觉得可以应用到很多地方
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-12-5 23:22:00 | 显示全部楼层
首先选择所有的直线,依次生成东、北、西、南的射线,求与直线的交点。


  1.   [FONT=courier new]
  2. Sub test()
  3.     Const PI = 3.1415926
  4.    
  5.     On Error Resume Next
  6.     ' 创建选择集
  7.     Dim SSetObj As Object
  8.     Set SSetObj = ThisDrawing.SelectionSets("SSET")
  9.     If Err.Number <> 0 Then
  10.         Err.Clear
  11.         Set SSetObj = ThisDrawing.SelectionSets.Add("SSET")
  12.     End If
  13.     SSetObj.Clear
  14.    
  15.     On Error GoTo ErrTrap
  16.     '创建过滤机制
  17.     Dim fType(0 To 0) As Integer
  18.     Dim fData(0 To 0) As Variant
  19.     fType(0) = 0: fData(0) = "LINE"
  20.    
  21.     '选择所有直线
  22.     SSetObj.Select acSelectionSetAll, , , fType, fData
  23.    
  24.     ' 选择点
  25.     Dim Pt As Variant
  26.     Pt = ThisDrawing.Utility.GetPoint(, "指定单元格内的一点: ")
  27.    
  28.     ' 确定射线的另一点(两点定出方向,这里是东向)
  29.     Dim tPt As Variant
  30.     tPt = ThisDrawing.Utility.PolarPoint(Pt, 0, 1)

  31.     ' 创建射线
  32.     Dim RayObj As AcadRay
  33.     Set RayObj = ThisDrawing.ModelSpace.AddRay(Pt, tPt)
  34.    
  35.     Dim MaxX As Double
  36.     MaxX = 99999999
  37.     Dim EntObj As AcadEntity
  38.     Dim v As Variant
  39.     ' 枚举选择集
  40.     For Each EntObj In SSetObj
  41.         v = EntObj.IntersectWith(RayObj, acExtendNone)
  42.         ' 直线与射线相交
  43.         If Not IsEmpty(v) Then
  44.             If UBound(v) > 0 Then If v(0) <= MaxX Then MaxX = v(0)
  45.         End If
  46.     Next
  47.     RayObj.Delete
  48.    
  49.     ' 确定射线的另一点(两点定出方向,这里是北向)
  50.     tPt = ThisDrawing.Utility.PolarPoint(Pt, PI / 2, 1)

  51.     ' 创建射线
  52.     Set RayObj = ThisDrawing.ModelSpace.AddRay(Pt, tPt)
  53.    
  54.     Dim MaxY As Double
  55.     MaxY = 99999999
  56.     ' 枚举选择集
  57.     For Each EntObj In SSetObj
  58.         v = EntObj.IntersectWith(RayObj, acExtendNone)
  59.         ' 直线与射线相交
  60.         If Not IsEmpty(v) Then
  61.             If UBound(v) > 0 Then If v(1) <= MaxY Then MaxY = v(1)
  62.         End If
  63.     Next
  64.     RayObj.Delete
  65.    
  66.     ' 确定射线的另一点(两点定出方向,这里是西向)
  67.     tPt = ThisDrawing.Utility.PolarPoint(Pt, PI, 1)

  68.     ' 创建射线
  69.     Set RayObj = ThisDrawing.ModelSpace.AddRay(Pt, tPt)
  70.    
  71.     Dim MinX As Double
  72.     MinX = -99999999
  73.     ' 枚举选择集
  74.     For Each EntObj In SSetObj
  75.         v = EntObj.IntersectWith(RayObj, acExtendNone)
  76.         ' 直线与射线相交
  77.         If Not IsEmpty(v) Then
  78.             If UBound(v) > 0 Then If v(0) >= MinX Then MinX = v(0)
  79.         End If
  80.     Next
  81.     RayObj.Delete
  82.    
  83.     ' 确定射线的另一点(两点定出方向,这里是南向)
  84.     tPt = ThisDrawing.Utility.PolarPoint(Pt, PI * 3 / 2, 1)

  85.     ' 创建射线
  86.     Set RayObj = ThisDrawing.ModelSpace.AddRay(Pt, tPt)
  87.    
  88.     Dim MinY As Double
  89.     MinY = -99999999
  90.     ' 枚举选择集
  91.     For Each EntObj In SSetObj
  92.         v = EntObj.IntersectWith(RayObj, acExtendNone)
  93.         ' 直线与射线相交
  94.         If Not IsEmpty(v) Then
  95.             If UBound(v) > 0 Then If v(1) >= MinY Then MinY = v(1)
  96.         End If
  97.     Next
  98.     RayObj.Delete
  99.     Set RayObj = Nothing
  100.     Set EntObj = Nothing
  101.     Set SSetObj = Nothing
  102.    
  103.     ' 打印数据
  104.     Debug.Print "单元格的宽度: " & MaxX - MinX
  105.     Debug.Print "单元格的高度: " & MaxY - MinY
  106.     Debug.Print "单元格的左下角点: " & MinX & "," & MinY
  107.     Debug.Print "单元格的右上角点: " & MaxX & "," & MaxY
  108.     Debug.Print "单元格的中心点: " & (MinX + MaxX) / 2 & "," & (MinY + MaxY) / 2
  109.     Exit Sub
  110.    
  111. ErrTrap:
  112.     On Error GoTo 0
  113. End Sub

  114. 立即窗口内容:
  115. 单元格的宽度: 106.349332501451
  116. 单元格的高度: 64.3045875866011
  117. 单元格的左下角点: 181.33924617877,84.7403666158115
  118. 单元格的右上角点: 287.688578680221,149.044954202413
  119. 单元格的中心点: 234.513912429495,116.892660409112
  120.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-6 16:50:07 | 显示全部楼层
谢谢版主
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-23 19:35 , Processed in 0.418421 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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