用delphi对AutoCAD的二次开发的一些小问题(200分)

看过VB做的类似于CAD软件,却没有看过DELPHI的。难道这一点DELPHI不如VB。
 
做的人很少!但有人做!而且肯定可以!希望得到先驱的帮助!
 
新增加一个简单一点的问题:选择一个范围内的图元对象,startpoint,endpoint
我用select不知如何实现?在AutoCAD软件中的命令行中直接输入select可以直接选择
文提出在哪?欢迎感兴趣的朋友帮帮忙!
 
是什么范围啊?矩形还是不规则形状?试过这个了吗?object.Select Mode[, Point1][, Point2][, FilterType][, FilterData]
 
强烈关注,我也想做一个,大有继续讨论
 
To nansha:最近做了一个检查数据的程序,感觉运行速度奇慢,是哪里出了问题还是就这么慢啊?
程序的操作并不复杂,根据条件选取实体,在一个代码表里查询其编码(thickness)是否符合要求,不符合要求的地方画一个圆。代码表有700条数据,放在数组里,用折半查找,查找速度不成问题。关键是程序执行太慢,选择集中有640个实体,执行时间要36秒。机器是PIV 2.4G。
请问nansha你的情况如何啊?
 
to 风雨中:是矩形,object.Select Mode[, Point1][, Point2][, FilterType][, FilterData] ,你用过了吗?我使用了一下,不能选择,对[, FilterType][, FilterData]理解不够,不只如何使用,请指教,或有例程,diguandai@21cn.com

你的问题,36秒时间差不多吧,我这边的数据只是图中的材料表,还没有涉及到对图中每个对象的查询,我还不会选取图中的单元(请指教),我是画图,循环和条件语句用得多,光是画图也要10几秒,你那个查询700多条,36秒应该不算长!

谢谢大家关注!周么忙,没上网!
 
哈哈,最近也在搞相关AUTOCAD的问题,新人,加入哦;
 
按矩形选择的使用方法,函数定义:
AcadSel.Select(acSelectionSetWindow, Pt1, Pt2, FilterType,FilterData);
其中的acSelectionSetWindow就是函数定义里的选择模式mode,在此为窗选。
其中Pt为3维点列表;初始化方法:
Pt1 := VarArrayCreate([0,2], VT_R8);Pt2 := VarArrayCreate([0,2], VT_R8);
Pt1[0]:=23;Pt1[1]:34;Pt1[2]:=0; Pt2[0]:=100;Pt2[1]:500;Pt2[2]:=0;

FilterType为过滤实体用的DXF组码数组:FilterType:= VarArrayCreate([0,1], VT_I2);
FilterData为过滤实体用的对应于DXF组码的值:FilterData:= VarArrayCreate([0,1], Varvariant)
后两个参数的意义是有条件地选择实体,比如你想选择在此矩形范围内的tlayer层的Lw线,可以这样:
FilterType[0]:=8; FilterData[0]:='tLayer';
FilterType[1]:=0; FilterData:[1]='LWPOLYLINE';
DXF组码和它的值的含意可在帮助文档中查到。

另外,对于执行效率问题,我觉得还是ActivX通迅速度慢的原因,因为对于现在的机器配置来说,一般的循环速度是相当快的。
 
非常感谢风雨中回言!我试了,仍未通过,我是这样写的:
try
acadApp:=GetActiveOleObject('autocad.application');
except
acadApp:=CreateOleObject('autocad.application');
end;
acadDoc:=acadApp.ActiveDocument;
acadApp.Visible:=true;
startpoint:= VarArrayCreate([0,2],8);
endpoint:= VarArrayCreate([0,2], 8);
FilterType:= VarArrayCreate([0,1], 2);
FilterData:= VarArrayCreate([0,1], Varvariant);
startpoint[0]:=0;
startpoint[1]:=0;
startpoint[2]:=0;
endpoint[0]:=500;
endpoint[1]:=500;
endpoint[2]:=0;
model:=acaddoc.modelspace;
acadDoc.Select(model,startpoint, endpoint, FilterType,FilterData);
以上语句编译通过,但运行不通过,显示“Method 'Select' not supported by automation object”,我的目的是选择(0,0,0)至(500,500,0)矩形区域内的所有图形单元,然后对我所选择的区域进行缩放和移动,还有我对Pt1 := VarArrayCreate([0,2], VT_R8);此句中的“VT_R8”理解不够,我改成Pt1 := VarArrayCreate([0,2], 8);则可通过。你说的mode我理解是ModelSpace(获得模型空间对象),不知对否?我改成modelspace编译通过,运行才出现上面的错误提示。
 
acSelectionSetWindow又如何定义呢?
 
我说兄弟啊:那是mode而不是model啊,那是系统预定义的常量,直接用就可以,可不是什么Model。

另外AcadDOC对象是没有Select方法的,就是“Method 'Select' not supported by automation object”的意思。只有SelectionSet对象才有此方法。ACAD帮助中的说明:
VBA class name: 类名
AcadSelectionSet
Create using: 创建方式
SelectionSets.Add
Access via: 访问方式
SelectionSets.Item
Document.ActiveSelectionSet
我的使用方法是:
var AcadSel: AcadSelectionSet;
AcadSel := AcadDoc.SelectionSets.Add('erer'); //'erer'是选择集名,随意
//然后就可以使用select方法构造选择集了:s
AcadSel.Select(acSelectionSetWindow, Pt1, Pt2, FilterType,FilterData);

使用前要判断选择集是否为空,能过查询AcadSel.Count属性来判断。

有时需要在同一文档内多次构造选择集,在第二次构造同一名称的选择集时会出错,可以用try加以判别:
try
AcadSel := AcadDoc.SelectionSets.Add('erer');
except
AcadDoc.SelectionSets.Item('erer').Delete;
AcadSel := AcadDoc.SelectionSets.Add('erer');
end;
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ComObj,AutoCad_TLB;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
AcadApp,AcadDoc:OleVariant;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
startPoint,endpoint,FilterType,FilterData:Variant;
AcadSel:AcadSelectionSet;
erer:string;
begin
try
AcadApp:=GetActiveOleObject('autocad.application');//运行出错[Error] Unit1.pas(41): Incompatible types: 'Variant' and 'IAcadSelectionSet'
except
AcadApp:=CreateOleObject('autocad.application');
end;
AcadDoc:=AcadApp.ActiveDocument;
AcadApp.Visible:=true;
try
AcadSel := AcadDoc.SelectionSets.Add('erer');
except
AcadDoc.SelectionSets.Item('erer').Delete;
AcadSel := AcadDoc.SelectionSets.Add('erer');
end;
startPoint:= VarArrayCreate([0,2],5);
endPoint:= VarArrayCreate([0,2],5);
startpoint[0]:=0;
startpoint[1]:=0;
startpoint[2]:=0;
endpoint[0]:=500;
endpoint[1]:=500;
endpoint[2]:=0;
acadDoc.Select(acSelectionSetWindow,startpoint, endpoint, FilterType,FilterData);
end;
end.
理解不够,我把练习代码贴出来,请你帮忙诊断指正!谢谢!
 
Incompatible types: 'Variant' and 'IAcadSelectionSet'的意思是类型不匹配,
注意,你这里的AcadDoc的定义是OleVariant类型,调用它的方法或属性时相应的返回值也是Variant类型的,所以产生了不匹配的错误,可将AcadDoc的类型定义为IAcadDocument类型,相应的AcadApp也应定义为IAcadApplication类型。
再改一下这里:AcadApp:=GetActiveOleObject('autocad.application') as IAcadApplication;

这里错在AcadDOc没有Select方法,AcadSel才有:
acadDoc.Select(acSelectionSetWindow,startpoint, endpoint, FilterType,FilterData);
改为:
Acadsel.Select(acSelectionSetWindow,startpoint, endpoint, FilterType,FilterData);

这样应该差不多了。再试一下吧。
对了,你这里还没给FilterType,FilterData赋值呢。
另外'erer'只是随便给的一个字符串,你这里定义erer变量就没用了。
 
“可将AcadDoc的类型定义为IAcadDocument类型,相应的AcadApp也应定义为IAcadApplication类型”,改后调试不成,我把我的小练习发到nansha123@21cn.com(www.21cn.com),密码123456,你查收一下,麻烦帮我调试一下,谢谢!
 
你发给我的修改后的程序在你机子上可以编译通过吗?在我的计算机上编译不通过
,我的软件配置(WinXP+D7+AUTOCAD2004),我运行了你编译的exe文件,运行后显示
Interface not supported,不知是什么原因?我编译出现如下错误:
[Error] Unit1.pas(45): Undeclared identifier: 'Delete'
[Error] Unit1.pas(64): Undeclared identifier: 'acSelectionSetWindow'
[Error] Unit1.pas(66): Undeclared identifier: 'EntityName'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
问题出在哪呢?第一次做,在接口问题上了解还不够!
 
我当然是通过了才给你发的了。不过你说的问题我也不太清楚。我的是XP+D7+Cad2002,CAD版本应该不存在什么问题,我一直都是看CAD2004的帮助的。
 
困惑?????我把机子上的AUTOCAD2004卸载后又装上AUTOCAD2002后,继续运行你修改后的例子,出现“未指定的错误”窗体!还是无法运行?何故呢?难道要重新装机再装AUTOCAD2002+D7?我觉得就是接口没对上,

acadApp: acadApplication;
acadDoc: acadDocument;//mzr的例子上看到的接口

acadApp,acadDoc:OleVariant;//我在一篇论文上看到的接口(我现在用)
这两个接口有什么不同之处,区别是什么?
 
本质上的区别不清楚,但使用中还是有区别的,我只知道两点:
1、用OleVariant没有代码提示
2、用OleVariant在调用函数时可以使用缺省参数,这点有时还是挺有用的。
现在我是两种都用,如果不需要使用缺省参数晨当然要用ACAD定义的类型了,在需要使用缺省参数时就用OleVariant类型。
 
to 风雨中:多谢关注!问题还要解决,现在继续提前!可否留下你的QQ号?交流方便!
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
866
DelphiTeacher的专栏
D
顶部