分享
 
 
 

用Ole Automation实现Delphi和AutoCad之间的数据交换

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

用Ole Automation实现Delphi和AutoCad之间的数据交换

广州 XD.W

AutoCad是一些做设计的朋友最常用软件之一,有时需要从AutoCad的图纸

中提取数据进行一些计算和优化工作,用手工进行提取工作量非常大;用AutoCad

的AutoLisp、ADS或者ObjectArx进行计算,对不熟悉的人来说掌握起来比较困难,

界面也不够友好。下面我们通过Ole Automation,利用Delphi来实现这一工作,

相关的AutoCad Automation信息请参见AutoCad的帮助文件acadauto.hlp。

首先在Delphi中建立一个新工程,在主Form放置三个TButton,分别命名为:

btnOpen,btnSend,btnGet,用于实现打开AutoCad,向Cad发送数据,从Cad提取

数据的功能,再放置一个TPaintBox,用于实现输出功能。下面是程序的主单元代码。

unit main;

interface

uses

file://在引用单元中要包含ComObj单元,用于支持Ole操作。

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ExtCtrls, ComObj;

const

file://定义AutoCad中的实体类型常量,本程序中只用到直线,所以只定义了直线的类型常量。

acLine = 19;

type

file://定义程序中用到的数据结构

ZPoint = record

x,y: double;

end;

PZLine = ^ZLine;

ZLine = record

sp,ep: ZPoint;

next: PZLine;

end;

TForm1 = class(TForm)

Panel1: TPanel;

btnOpen: TButton;

BtnSend: TButton;

btnGet: TButton;

PaintBox1: TPaintBox;

procedure btnOpenClick(Sender: TObject);

procedure btnSendClick(Sender: TObject);

procedure btnGetClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure PaintBox1Paint(Sender: TObject);

private

file://存放数据的指针

pData: PZLine;

file://释放存放数据的内存

procedure FreeData;

public

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FreeData;

var

pTmp: PZLine;

begin

file://释放数据链表内存

while pData <> nil do begin

pTmp := pData;

pData := pData^.next;

Dispose(pTmp);

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

file://在主窗体的创建时初始化数据指针

pData := nil;

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

file://在主窗体的销毁过程中释放内存

FreeData;

end;

file://打开AutoCad

procedure TForm1.btnOpenClick(Sender: TObject);

var

AcadApp : OleVariant;

begin

file://通过创建Ole Automation对象启动AutoCad

AcadApp := CreateOleObject('AutoCad.Application');

AcadApp.visible := true;

file://OleVariant数据类型是自动释放的,所以这里没有释放代码

end;

file://向AutoCad发送数据

procedure TForm1.btnSendClick(Sender: TObject);

var

AcadApp: OleVariant;

AcadDoc: OleVariant;

AcadMoSpace: OleVariant;

sp,ep: Variant;

pTmp: PZLine;

begin

file://得到已启动的AutoCad Application对象

AcadApp := GetActiveOleObject('AutoCad.Application');

file://得到AutoCad Document对象

AcadDoc := AcadApp.ActiveDocument;

file://得到AutoCad ModelSpace对象

AcadMoSpace := AcadDoc.ModelSpace;

file://遍历数据链表

pTmp := pData;

while pTmp <> nil do begin

file://创建包含数组的Variant变量sp,用于向AutoCad传递起点数据

sp := VarArrayCreate([0,2],VarDouble);

sp[0] := pTmp^.sp.x;

sp[1] := pTmp^.sp.y;

sp[2] := 0.0;

file://创建包含数组的Variant变量ep,用于向AutoCad传送终点数据

ep := VarArrayCreate([0,2],VarDouble);

ep[0] := pTmp^.ep.x;

ep[1] := pTmp^.ep.y;

ep[2] := 0.0;

file://VarArrayRef把包含数组的Variant变量转换成Variant数组,

file://使用AutoCad 14.0时要调用此函数,AutoCad 2000不需要

AcadMoSpace.AddLine(VarArrayRef(sp),VarArrayRef(ep));

pTmp := pTmp^.next;

end;

end;

file://从AutoCad提取数据

procedure TForm1.btnGetClick(Sender: TObject);

var

AcadApp: OleVariant;

AcadDoc: OleVariant;

AcadMoSpace: OleVariant;

AcadObj: OleVariant;

AcadPt: Variant;

i: integer;

EntiType: Integer;

pTmp: PZLine;

begin

file://得到所需的AutoCad对象

AcadApp := GetActiveOleObject('AutoCad.Application');

AcadDoc := AcadApp.ActiveDocument;

AcadMoSpace := AcadDoc.ModelSpace;

file://释放以前存放的数据

FreeData;

file://遍历模型空间中的每一个实体对象

for i := 0 to AcadMoSpace.Count-1 do begin

file://引用第i个实体对象

AcadObj := AcadMoSpace.Item(i);

file://提取实体类型

EntiType := AcadObj.EntityType;

file://判断是不是直线

if EntiType = acLine then begin

file://如果是直线,则提取相应的起点终点数据

new(pTmp);

AcadPt := AcadObj.StartPoint;

pTmp^.sp.x := AcadPt[0];

pTmp^.sp.y := AcadPt[1];

AcadPt := AcadObj.EndPoint;

pTmp^.ep.x := AcadPt[0];

pTmp^.ep.y := AcadPt[1];

pTmp^.next := pData;

pData := pTmp;

end;

end;

file://刷新用于显示结果的PaintBox

PaintBox1.Invalidate;

end;

file://显示提取的数据

procedure TForm1.PaintBox1Paint(Sender: TObject);

var

MaxX, MaxY: double;

MinX, MinY: double;

pTmp: PZLine;

scale: double;

x,y: integer;

begin

pTmp := pData;

if pTmp = nil then exit;

file://计算放缩比例

MaxX := pTmp^.sp.x;

MinX := MaxX;

MaxY := pTmp^.sp.y;

MinY := MaxY;

while pTmp <> nil do begin

if MaxX < pTmp^.sp.x then MaxX := pTmp^.sp.x;

if MinX > pTmp^.sp.x then MinX := pTmp^.sp.x;

if MaxY < pTmp^.sp.y then MaxY := pTmp^.sp.y;

if MinY > pTmp^.sp.y then MinY := pTmp^.sp.y;

if MaxX < pTmp^.ep.x then MaxX := pTmp^.ep.x;

if MinX > pTmp^.ep.x then MinX := pTmp^.ep.x;

if MaxY < pTmp^.ep.y then MaxY := pTmp^.ep.y;

if MinY > pTmp^.ep.y then MinY := pTmp^.ep.y;

pTmp := pTmp^.next;

end;

scale := (PaintBox1.Width - 10) / (MaxX-MinX);

if scale > (PaintBox1.Height - 10) / (MaxY-MinY) then begin

scale := (PaintBox1.Height - 10) / (MaxY-MinY);

end;

file://显示提取的数据

pTmp := pData;

while pTmp <> nil do begin

x := round((pTmp^.sp.x - MinX) * scale) + 5;

y := PaintBox1.Height - (round((pTmp^.sp.y - MinY) * scale) + 5);

PaintBox1.Canvas.MoveTo(x,y);

x := round((pTmp^.ep.x - MinX) * scale) + 5;

y := PaintBox1.Height - (round((pTmp^.ep.y - MinY) * scale) + 5);

PaintBox1.Canvas.LineTo(x,y);

pTmp := pTmp^.next;

end;

end;

end.

本程序在PWin98se+Delphi5.0环境下编译通过,在AutoCad14.0、AutoCad2000

下运行通过,源代码可在此下载:http://wangxd.51.net/software/delphicad.zip

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有