E
emoth
Unregistered / Unconfirmed
GUEST, unregistred user!
兄弟我向来都在用DELPHI(以前用VB)利用AutoCAD的ACTIVE AUTOMATION来进行CAD的
二次开发,现在遇到一个问题,不思不得其解:
我想通过程序在CAD中建立一个选择集,CAD帮助中的语法如下:
///////////////////////////////////
SelectOnScreen Method
Prompts the user to pick an object from the screen.
Signature
object.SelectOnScreen [FilterType][, FilterData]
Object SelectionSet,The object or objects this method applies to
FilterType Integer; input-only; optional A DXF group code specifying the type of filter to use.
FilterData Variant; input-only; optional The value to filter on.
Remarks
This method supports the filtering mechanism.
AutoCAD's default prompt for picking an object will be used automatically.
For more selection mode options, see the Select, SelectByPolygon, and SelectAtPoint methods.
////////////////////////////
应该说对于VB或者DELPHI程序语言来说,只要遵循此接口语法就可以正常使用SelectionSet的此“选择方法”。
但是我用DELPHI却总是不能成功,代码如下:
unit UnitMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Comobj;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses AutoCAD_TLB; //引用CAD接口单元
{$R *.dfm}
//建立选择集
procedure TForm1.Button1Click(Sender: TObject);
var
CadApp:IAcadApplication;//CAD应用程序对象
CadDOC:IAcadDocument;//CAD文档对象
CadSelect:IAcadSelectionSet;//CAD选择集对象
vType,vData:OleVariant;
begin
try
//获得CAD对象
cadapp:=GetActiveOleObject('AutoCAD.Application.15') as iAcadApplication;
caddoc:=CadApp.ActiveDocument;
try
//建立名为NEWSELECT的CAD选择集
CadSelect:=CadDOC.SelectionSets.Add('NewSelect');
//为SelectOnScreen方法的FilterType, FilterData参数做准备
vType:=VarArrayCreate([0,1],varInteger);
vData:=VarArrayCreate([0,1],varVariant);
vType[0]:=8;
vType[1]:=62;
vData[0]:='0';
vData[1]:=7;
//根据FilterType和FilterData建立选择集
★ CadSelect.SelectOnScreen(vType,VarArrayRef(vData));
//显示选择集的成员总数
ShowMessage(IntToStr(cadselect.count));
finally
//从CAD中删除选择集对象
CadDOC.SelectionSets.Item('NewSelect').Delete;
end;
except
on E:Exception do
ShowMessage(E.Message);
end;
end;
end.
程序运行到★句时,总说OLE错误,而且是未指定的错误。如果不指定FilterType, FilterData参数
(应该支持缺省),居然连编译都无法通过。
但是我用VB来编程,却又随便都能成功,代码我就不写了,具体过程如下。
因为VB无法象DELPHI一样用VarArrayCreat来建立一个数组,因此就只能先声明两个数组,
一个为Integer类型,一个为Variant类型,然后为它们赋值。
由于SelectOnScreen方法的FilterType, FilterData参数需要传递的是Variant类型,
因此就在VB中再次声明两个Variant类型的变量,将数组赋与此变量,
调用SelectOnScreen方法,成功!!
此外,也可以不设置FilterType, FilterData参数,同样可以成功。
难道真的是在这上面DELPHI不敌VB?
DELPHI对数据的类型要求是否太严格了??还是别的什么原因???
二次开发,现在遇到一个问题,不思不得其解:
我想通过程序在CAD中建立一个选择集,CAD帮助中的语法如下:
///////////////////////////////////
SelectOnScreen Method
Prompts the user to pick an object from the screen.
Signature
object.SelectOnScreen [FilterType][, FilterData]
Object SelectionSet,The object or objects this method applies to
FilterType Integer; input-only; optional A DXF group code specifying the type of filter to use.
FilterData Variant; input-only; optional The value to filter on.
Remarks
This method supports the filtering mechanism.
AutoCAD's default prompt for picking an object will be used automatically.
For more selection mode options, see the Select, SelectByPolygon, and SelectAtPoint methods.
////////////////////////////
应该说对于VB或者DELPHI程序语言来说,只要遵循此接口语法就可以正常使用SelectionSet的此“选择方法”。
但是我用DELPHI却总是不能成功,代码如下:
unit UnitMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Comobj;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses AutoCAD_TLB; //引用CAD接口单元
{$R *.dfm}
//建立选择集
procedure TForm1.Button1Click(Sender: TObject);
var
CadApp:IAcadApplication;//CAD应用程序对象
CadDOC:IAcadDocument;//CAD文档对象
CadSelect:IAcadSelectionSet;//CAD选择集对象
vType,vData:OleVariant;
begin
try
//获得CAD对象
cadapp:=GetActiveOleObject('AutoCAD.Application.15') as iAcadApplication;
caddoc:=CadApp.ActiveDocument;
try
//建立名为NEWSELECT的CAD选择集
CadSelect:=CadDOC.SelectionSets.Add('NewSelect');
//为SelectOnScreen方法的FilterType, FilterData参数做准备
vType:=VarArrayCreate([0,1],varInteger);
vData:=VarArrayCreate([0,1],varVariant);
vType[0]:=8;
vType[1]:=62;
vData[0]:='0';
vData[1]:=7;
//根据FilterType和FilterData建立选择集
★ CadSelect.SelectOnScreen(vType,VarArrayRef(vData));
//显示选择集的成员总数
ShowMessage(IntToStr(cadselect.count));
finally
//从CAD中删除选择集对象
CadDOC.SelectionSets.Item('NewSelect').Delete;
end;
except
on E:Exception do
ShowMessage(E.Message);
end;
end;
end.
程序运行到★句时,总说OLE错误,而且是未指定的错误。如果不指定FilterType, FilterData参数
(应该支持缺省),居然连编译都无法通过。
但是我用VB来编程,却又随便都能成功,代码我就不写了,具体过程如下。
因为VB无法象DELPHI一样用VarArrayCreat来建立一个数组,因此就只能先声明两个数组,
一个为Integer类型,一个为Variant类型,然后为它们赋值。
由于SelectOnScreen方法的FilterType, FilterData参数需要传递的是Variant类型,
因此就在VB中再次声明两个Variant类型的变量,将数组赋与此变量,
调用SelectOnScreen方法,成功!!
此外,也可以不设置FilterType, FilterData参数,同样可以成功。
难道真的是在这上面DELPHI不敌VB?
DELPHI对数据的类型要求是否太严格了??还是别的什么原因???