C#对AutoCad二次开发的问题

xu_2007 2008-12-12 06:33:17
请问用C#把AUTOCAD载入自己创建的WINDOWS窗体并且已经加载了一张图形后,如何在用鼠标点击图中某条线或某个层或某个字符串后返回它们在图中的坐标值以及其它属性等等,也就是说如何获取鼠标点击事件并通过事件参数得到它的坐标值等等,谢谢!
...全文
396 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiying1988 2008-12-15
  • 打赏
  • 举报
回复
up
wangping_li 2008-12-15
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 xu_2007 的回复:]
Dim Object As Object
Dim PickedPoint As Variant
Dim TransMatrix As Variant
Dim ContextData As Variant

这么些个数据类型在C#中都不知道用什么类型来替换!6楼朋友能解释一下这些类型吗?
[/Quote]
C#没有Variant数据类型,可否用Object代替呢?
xu_2007 2008-12-15
  • 打赏
  • 举报
回复
zengzhe 朋友可否加个好友向你讨教下,我的QQ:128047!谢了!
xu_2007 2008-12-15
  • 打赏
  • 举报
回复
Dim Object As Object
Dim PickedPoint As Variant
Dim TransMatrix As Variant
Dim ContextData As Variant

这么些个数据类型在C#中都不知道用什么类型来替换!6楼朋友能解释一下这些类型吗?
yingzi85 2008-12-15
  • 打赏
  • 举报
回复
学习
philozz 2008-12-15
  • 打赏
  • 举报
回复
仓促修改一下:

Sub GetSubEntityInfo()

Dim Object As Object
Dim PickedPoint As Variant
Dim TransMatrix As Variant
Dim ContextData As Variant
Dim HasContextData As String

On Error GoTo NOT_ENTITY

TRYAGAIN:

MsgBox "在这个对话框关闭后,使用鼠标选择当前图形上的图元"

ThisDrawing.Utility.GetSubEntity Object, PickedPoint, TransMatrix, ContextData

HasContextData = IIf(VarType(ContextData) = vbEmpty, "没有", "有")

MsgBox "您选择的对象是: " & TypeName(Object) & vbCrLf & _
"拾取点坐标: " & PickedPoint(0) & ", " & _
PickedPoint(1) & ", " & _
PickedPoint(2) & vbCrLf & _
"这个对象" & HasContextData & "具有嵌套对象."

Select Case TypeName(Object)
Case "IAcadPolyline", "IAcadLWPolyline", "IAcad3DPolyline"
For i = 0 To GetVertexCount(Object) - 1
OutStr = OutStr & vbCrLf & Utility.RealToString(Object.Coordinate(i)(0), acDefaultUnits, 3)
OutStr = OutStr & " " & Utility.RealToString(Object.Coordinate(i)(1), acDefaultUnits, 3)
If TypeName(Object) = "IAcad3DPolyline" Then
OutStr = OutStr & " " & Utility.RealToString(Object.Coordinate(i)(2), acDefaultUnits, 3)
Else
OutStr = OutStr & " " & Utility.RealToString(Object.Elevation, acDefaultUnits, 3)
End If
Next
Case "IAcadPoint"
pt = Object.Coordinates
OutStr = Utility.RealToString(pt(0), acDefaultUnits, 3)
OutStr = OutStr & " " & Utility.RealToString(pt(1), acDefaultUnits, 3)
OutStr = OutStr & " " & Utility.RealToString(pt(2), acDefaultUnits, 3)
Case "IAcadBlockReference2", "IAcadShape"
pt = Object.InsertionPoint
OutStr = Utility.RealToString(pt(0), acDefaultUnits, 3)
OutStr = OutStr & " " & Utility.RealToString(pt(1), acDefaultUnits, 3)
OutStr = OutStr & " " & Utility.RealToString(pt(2), acDefaultUnits, 3)
End Select

MsgBox OutStr


Exit Sub

NOT_ENTITY:
If MsgBox("您未选中图元。按OK重试.", _
vbOKCancel & vbInformation) = vbOK Then
Resume TRYAGAIN
End If
End Sub

Public Function GetVertexCount(Polyline) As Integer
On Error Resume Next
Select Case TypeName(Polyline)
Case "IAcadLWPolyline"
VertList = Polyline.Coordinates
GetVertexCount = (UBound(VertList) + 1) / 2
Case "IAcadPolyline", "IAcad3DPolyline"
VertList = Polyline.Coordinates
GetVertexCount = (UBound(VertList) + 1) / 3
End Select
End Function
philozz 2008-12-15
  • 打赏
  • 举报
回复
GetSubEntityInfo返回的是真实的AUTOCAD里面图形里面的坐标值.
再参考:

Sub GetSubEntityInfo()

Dim Object As Object
Dim PickedPoint As Variant
Dim TransMatrix As Variant
Dim ContextData As Variant
Dim HasContextData As String

On Error GoTo NOT_ENTITY

TRYAGAIN:

MsgBox "在这个对话框关闭后,使用鼠标选择当前图形上的图元"

ThisDrawing.Utility.GetSubEntity Object, PickedPoint, TransMatrix, ContextData

HasContextData = IIf(VarType(ContextData) = vbEmpty, "没有", "有")

MsgBox "您选择的对象是: " & TypeName(Object) & vbCrLf & _
"拾取点坐标: " & PickedPoint(0) & ", " & _
PickedPoint(1) & ", " & _
PickedPoint(2) & vbCrLf & _
"这个对象" & HasContextData & "具有嵌套对象."

Select Case TypeName(Object)
Case "IAcadPolyline", "IAcadLWPolyline", "IAcad3DPolyline"
'Dim n As Long: n = Object.GetVertexCount
For i = 0 To GetVertexCount(Object) - 1
OutStr = OutStr & vbCrLf & Utility.RealToString(Object.Coordinate(i)(0), acDefaultUnits, 3)
OutStr = OutStr & " " & Utility.RealToString(Object.Coordinate(i)(1), acDefaultUnits, 3)
If TypeName(Object) = "IAcad3DPolyline" Then
OutStr = OutStr & vbCrLf & " " & Utility.RealToString(Object.Coordinate(i)(2), acDefaultUnits, 3)
Else
OutStr = OutStr & vbCrLf & " " & Utility.RealToString(Object.Elevation, acDefaultUnits, 3)
End If
Next
Case "IAcadPoint"
pt = Object.Coordinates
OutStr = Utility.RealToString(pt(0), acDefaultUnits, 3)
OutStr = OutStr & " " & Utility.RealToString(pt(1), acDefaultUnits, 3)
OutStr = OutStr & " " & Utility.RealToString(pt(2), acDefaultUnits, 3)
Case "IAcadBlockReference2", "IAcadShape"
pt = Object.InsertionPoint
OutStr = Utility.RealToString(pt(0), acDefaultUnits, 3)
OutStr = OutStr & " " & Utility.RealToString(pt(1), acDefaultUnits, 3)
OutStr = OutStr & " " & Utility.RealToString(pt(2), acDefaultUnits, 3)
End Select

MsgBox OutStr


Exit Sub

NOT_ENTITY:
If MsgBox("您未选中图元。按OK重试.", _
vbOKCancel & vbInformation) = vbOK Then
Resume TRYAGAIN
End If
End Sub

Public Function GetVertexCount(Polyline) As Integer
On Error Resume Next
Select Case TypeName(Polyline)
Case "IAcadLWPolyline"
VertList = Polyline.Coordinates
GetVertexCount = (UBound(VertList) + 1) / 2
Case "IAcadPolyline", "IAcad3DPolyline"
VertList = Polyline.Coordinates
GetVertexCount = (UBound(VertList) + 1) / 3
End Select
End Function
xu_2007 2008-12-15
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 wangping_li 的回复:]
引用 20 楼 xu_2007 的回复:
Dim Object As Object
Dim PickedPoint As Variant
Dim TransMatrix As Variant
Dim ContextData As Variant

这么些个数据类型在C#中都不知道用什么类型来替换!6楼朋友能解释一下这些类型吗?

C#没有Variant数据类型,可否用Object代替呢?
[/Quote]

不行的,会报错!
xu_2007 2008-12-14
  • 打赏
  • 举报
回复
6楼的说的有点像,不过怎么不来回贴了?
slimfeng 2008-12-14
  • 打赏
  • 举报
回复
没做过,帮顶一下。
xu_2007 2008-12-14
  • 打赏
  • 举报
回复
没人做过这种开发吗?
xu_2007 2008-12-13
  • 打赏
  • 举报
回复
请问q2onq2朋友在不在,如果在的话麻烦进来看看我这个问题,谢谢!
EveryCase 2008-12-13
  • 打赏
  • 举报
回复
xu_2007 2008-12-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zengzhe 的回复:]
请参考:
Sub GetSubEntityInfo()

Dim Object As Object
Dim PickedPoint As Variant
Dim TransMatrix As Variant
Dim ContextData As Variant
Dim HasContextData As String

On Error GoTo NOT_ENTITY

TRYAGAIN:

MsgBox "在这个对话框关闭后,使用鼠标选择当前图形上的图元"

ThisDrawing.Utility.GetSubEntity Object, PickedPo…
[/Quote]

这位朋友,我想问下你这种方法最终获得的坐标是某个点或线在这张图形里面的坐标值,还是程序窗体客户区的坐标值,谢谢!
xu_2007 2008-12-13
  • 打赏
  • 举报
回复
你们实现的是当数标点击应用程序后获得应用程序的坐标值,而并不是真实的AUTOCAD里面图形里面的坐标值!
xu_2007 2008-12-13
  • 打赏
  • 举报
回复
楼上两位朋友,我要获得的是AUTOCAD里面的图形里面的某个点的坐标值,并不是获得C#开发的应用程序客户区或非客户区的坐标值!
xu_2007 2008-12-13
  • 打赏
  • 举报
回复
顶一下,不要沉了!
橙子撸代码 2008-12-12
  • 打赏
  • 举报
回复
看下面代码,获取就是你要的:

// Mouse Position Operation
//Code Technology Document
//NITI Collection
//图片的划分
//Bottom_Left
//Bottom_Middle
//Bottom_Right
//
//Middle_Left左边框
//Middle_Right右边框
//标题栏
//Top_Left
//Top_Middle
//Top_Right
//系统按钮
//SysButton_Min
//SysButton_Max
//SysButton_Close
//SysButton_Restore
namespace mouse
{
//以下是上述画皮肤方法的具体实现部分,举一个画左边框的代码示例,
private void DrawMiddle_Left(Graphics g)
{
 Brush brush = new TextureBrush(Middle_Left, new Rectangle(0, 0,Middle_Left.Width, Middle_Left.Height));
 g.FillRectangle(brush, 0, TITLE_WIDTH, Middle_Left.Width,Height - Bottom_Middle.Height - TITLE_WIDTH);
}

  鼠标移动 ,以及反应代码

  //定义了一个抽象的基类MouseAction,用来表示所有的鼠标事件,它有一个抽象方法Action:

public abstract class MouseAction
{
 public abstract void Action(int ScreenX, int ScreenY, System.Windows.Forms.Form form);
}
//向右拉伸窗口事件的代码响应
// MouseSizeLeft:拉伸左边框
// MouseSizeBottom:拉伸下边框
// MouseSizeTop:拉伸上边框
// MouseSizeTopLeft:拉伸左上角
// MouseSizeTopRight:拉伸右上角
// MouseSizeBottomLeft:拉伸左下角
// MouseSizeBottomRight:拉伸右下角
// MouseDrag:鼠标拖动
public class MouseSizeRight : MouseAction
{
 private int lx;
 public MouseSizeRight(int LocationX)
 {
  lx = LocationX;
 }
 public override void Action(int ScreenX, int ScreenY, System.Windows.Forms.Form form)
 {
  form.Width = ScreenX - lx;
  form.Invalidate();
 }
}
// 鼠标拖动同样也很简单,不过却稍不同于窗口的缩放拉伸,这里举出它的实现代码:
public class MouseDrag : MouseAction
{
 private int x, y;
 public MouseDrag(int hitX, int hitY)
 {
  x = hitX;
  y = hitY;
 }
 public override void Action(int ScreenX, int ScreenY, System.Windows.Forms.Form form)
 {
  form.Location = new Point(ScreenX - x, ScreenY - y);
 }
}
//接下来我们开始编写发出事件的代码,先定义几个变量:
private int LEFT = 5, RIGHT = 5, BOTTOM = 5, TOP = 5, TITLE_WIDTH = 45;//边框和标题栏的大小
private int x = 0, y = 0;//保存鼠标的临时坐标
private MouseAction mouse;//鼠标的事件响应对象
然后在Form的MouseDown事件中记录下鼠标的当前坐标:
x = e.X;
y = e.Y;
附:e为System.Windows.Forms.MouseEventArgs


///根据鼠标的坐标定义出事件响应对象:

  ///

//鼠标点击左上边框
if((e.X <= LEFT + 10 && e.Y <= TOP) || (e.Y <= TOP + 10 && e.X <= LEFT))
{
mouse = new MouseSizeTopLeft(Location.X, Location.Y, Width, Height);
return;
}
//鼠标点击系统关闭按纽
if(e.X > Width - 20 && e.Y > 6 && e.X < Width - 20 + SysButton_Min.Width && e.Y < 6 + SysButton_Min.Height)
{
Close();
return;
}
//大部分的事件响应实际上是在MouseMove事件中完成的:
private void Form_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
 this.Parent.Cursor = CheckCursorType(e.X, e.Y);//改变鼠标的指针形状
 if(mouse != null)
 {
 mouse.Action(Control.MousePosition.X, Control.MousePosition.Y, this);//执行时间响应
 //注意坐标是Control.MousePosition这个静态变量给出的,它的值为鼠标在桌面上的全局坐标
 }
}
最后,MouseUp事件中将mouse变量释放掉:
private void Form_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
mouse = null;
}
加上标题栏的双击最大化或者还原的事件:
private void Form_DoubleClick(object sender, System.EventArgs e)
{
  if(y > TOP && y < TITLE_WIDTH)
  {
  if(WindowState == FormWindowState.Normal)
  {
   WindowState = FormWindowState.Maximized;
   SysButton = SysButton_Restore;
   Invalidate();
  }
  else if(WindowState == FormWindowState.Maximized)
  {
   WindowState = FormWindowState.Normal;
   SysButton = SysButton_Max;
   Invalidate();
  }
  }
}
//防止窗体被缩小成一个点,最好给窗口的MinimumSize赋上一个适当的值,例如200,200
}

philozz 2008-12-12
  • 打赏
  • 举报
回复
请参考:
Sub GetSubEntityInfo()

Dim Object As Object
Dim PickedPoint As Variant
Dim TransMatrix As Variant
Dim ContextData As Variant
Dim HasContextData As String

On Error GoTo NOT_ENTITY

TRYAGAIN:

MsgBox "在这个对话框关闭后,使用鼠标选择当前图形上的图元"

ThisDrawing.Utility.GetSubEntity Object, PickedPoint, TransMatrix, ContextData

HasContextData = IIf(VarType(ContextData) = vbEmpty, "没有", "有")

MsgBox "您选择的对象是: " & TypeName(Object) & vbCrLf & _
"拾取点坐标: " & PickedPoint(0) & ", " & _
PickedPoint(1) & ", " & _
PickedPoint(2) & vbCrLf & _
"这个对象" & HasContextData & "具有嵌套对象."

Exit Sub

NOT_ENTITY:
If MsgBox("您未选中图元。按OK重试.", _
vbOKCancel & vbInformation) = vbOK Then
Resume TRYAGAIN
End If
End Sub
kingcsx666 2008-12-12
  • 打赏
  • 举报
回复
up
加载更多回复(4)

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧