当前位置:主页>销售管理软件> 列表

用delphi对AutoCAD的二次开发的一些小问题 找局域网文件管理软件

库存管理软件版1楼: 热烈欢迎对AutoCAD二次开发感兴趣的朋友们!
领导安排了活,是对AutoCAD的二次开发,我手头也有一些资料,可是不全,因初次涉入这个领域,网上大部分是用Vba开发的,用Delphi开发的有,但不多,大多都是画个直线,画个圆之类的,AutoCAD的帮助文件也是Vba的,脑袋苯,看了,也试了,不成,所以特提出以下问题,请热心的朋友帮帮忙:
1、如何设定当前线型?
2、如何标注尺寸?
3、如何画带箭头的线?
4、随着课题的进展问题还在出现中。。。
我提的每个问题分值100,欢迎答题!
QQ:530741837,更欢迎对AutoCAD二次开发感兴趣的朋友们加我的QQ,互相学习,交流资料,互相进步!

2楼: 到 http://www.tomore.com上找。我在上面放了不少相关源码。 如零售管理软件

3楼: 非常感谢mzr兄的指引,你修改的例子我看了,很好!给我指引了看AutoCAD2004的帮助文件里,有非常详细的例程,虽然是VBA的,英文的,但帮助很大。设定线型解决了,标主尺寸解决了,但解决的都不很理想,还存在以下问题:
1、在CAD中如果没有我想要得线型,就加栽,但在加栽的过程中出现问题了,程序如下:


lts:=acaddoc.linetypes;
lt:=lts.item(i);
for i:=0 to lts.count -1 do
begin
if lt.name=''Dashed'' then
acadDoc.SetVariable(''CELTYPE'',''Dashed'')
else
begin
lt:=lts.load(''Dashed'',''acad.Lin'');
acadDoc.SetVariable(''CELTYPE'',''Dashed'');
end
end;
虽然编译通过,但在运行时出现“记录名重复”,不知道哪个地方写错了!
2、标注线都标好了,文字也标上了,但是标注线和我要标注的直线重合在一起,也就是箭头两端的垂直直线段的长度如何设置,也就是标注线和我想要标注的直线间的距离如何设置!期待。。。

4楼: 楼上的兄弟,各位专家:
你在做什么系统?
我最近也在研究这方面的东西,现在我有个问题:现在用autocad中划个图形,和delphi结合起来,就是说,cad的一些图形信息保存在数据库中,然后delphi进行控制。
我想问的是:一个图形,我用一种红颜色把这个图形填充后,在delphi中怎么获取这个信息,然后把这个图形的相关属性数据保存到数据库?

5楼: 我再做一个工程制图软件,主要是二维画图、材料统计和价格分析等,你能不能把你填充的图形参数直接写入数据库,下次直接从数据库中调入!谢谢你加入进来!欢迎经常提问题!共同进步!

6楼: 又有新问题了:


1、画的线的粗细的属性不知,不知如何设置?如:我要画1mm粗的线?
2、我添加的文字如何设置它的字体?如:“宋体”?

库存管理软件版7楼: 你好,碰巧,我现在也在研究工程仿真图形方面的东西,咱们可以交流一下。
你的系统现在怎样了

8楼: 我想做一个软件关于工程进度、自动计算工程量等方面的信息。
应该和你的差不多。你的思路是什么?

9楼: to:guofengdelphi,我是做的平面二维图,制图和材料及价格的自动计算,能留下你的QQ号吗?晚上联系!

10楼: to:nansha

我的qq:32139299

11楼: 我也有这方面的想法,想做一个二维地图可以一起讨论吗?
我的QQ号,是331890218

12楼: 热烈欢迎!非常感谢网络(大富翁论坛)平台,认识你们!和你们共同学习,共同进步!因昨夜有两幅图要赶,没上网!今晚QQ上见! 如服装进销存

13楼: 什么两幅图,要自己画 啊?

库存管理软件版14楼: 周末提前,希望碰到对CAD二次开发感兴趣的朋友!

15楼: 留个名,学习中。

16楼: 风雨中:可以告知你正在忙什么项目?

17楼: 这太简单
了 [:D]

18楼: to free_eagle:用实例说话,


1:标注线都标好了,文字也标上了,但是标注线和我要标注的直线重合在一起,也就是箭头两端的垂直直线段的长度如何设置,也就是标注线和我想要标注的直线间的距离如何设置!
2:画的线的粗细的属性不知,不知如何设置?如:我要画1mm粗的线?
今天自己解决:“宋体”字体的添加!

19楼: 还有一个问题:添加多行文字:
startPoint[0]:=-310;
startPoint[1]:=80;
startPoint[2]:=0;
acadDoc.ModelSpace.addMText(varArrayRef(startPoint),5,''说明:''+#13#10+''1.本图单位尺寸以米计,管径单位以毫米计'');
在CAD中显示的是乱码?不知是什么原因?

20楼: 又有一个新问题:人机交换?具体就是,我现在想选择屏幕上CAD软件上已有的点、线、文字等,通过button去选择屏幕上的线或文字,然后对我选择的文字就行操作?
我查阅了资料,通过“SelectOnScreen”进行选择,可我试了,不成,可能使我没有领透这个命令,希望感兴趣的朋友指点一二!free__eagle---me?
标注线问题自我已经解决!

库存管理软件版21楼: to nansha:
呵呵!你现在成了大富翁的“AutoCAD的二次开发”专家了![:)]
我正要用Delphi开发一个AutoCAD的二次开发项目,等项目定下来,你愿意做外包吗?

22楼: 好啊!有钱大家挣! 如局域网文件管理软件

23楼: 用VC做二次开发吧,更简单些,利用ARX,不知道这个技术过时没有,我n年前用他写过专家系统,或者用Lisp写,感觉delphi资源少些,只用com接口,感觉不够用

24楼: vc不熟,我在网上查了,很多人写了一些有关delphi二次开发CAD的软件论文,论文只写了一些框架,没有技术方面的很好的实例,网上资源又少,但我相信肯定可以,而且我现在做的程度告诉我,肯定可以做,就是实现的方法和技术问题!谢谢郭兄指引!希望更多的朋友加入到这个话题当中来!

25楼: 再次将问题提前!期望遇到对CAD二次开发感兴趣的朋友!


1、人机交换?具体就是,我现在想选择屏幕上CAD软件上已有的点、线、文字等,通过button去选择屏幕上的线或文字,然后对我选择的文字就行操作?
我查阅了资料,通过“SelectOnScreen”进行选择,可我试了,不成,可能使我没有领透这个命令,希望感兴趣的朋友指点一二!
2、添加多行文字:
startPoint[0]:=-310;
startPoint[1]:=80;
startPoint[2]:=0;
acadDoc.ModelSpace.addMText(varArrayRef(startPoint),5,''说明:''+#13#10+''1.本图单位尺寸以米计,管径单位以毫米计'');
在CAD中显示的是乱码?不知是什么原因?

26楼: 一个大的dwg文件里往往包含多张图纸,如一个大楼的图里有立面图、平面图等。
如何将AUTOCAD图纸文件dwg中的多张图纸自动分解成多个小的dwg文件和对应的PLT文件,即一张图纸对应一个dwg文件。 ---现金求购

27楼: to:qqqqqqqq
可以发一张你的大图过来吗?有空试试!
E-mail:diguandai@21cn.com

库存管理软件版28楼: to:nansha
明天给您dwg图

29楼: to qqqqqqqq:我看了你发的dwg图,图上有4附带边框的图,你的意思是将这4附图分开,分成4个文件另行保存,是吗?还是别的?

30楼: to nansha
基本没错,进一步还要将这分离出来的dwg文件转换为PLT文件.

31楼: 问题较难,如何判断每个图元是单独的一幅图?在思考。。。

32楼: 是有技术难度,能不能先找出每一幅子图的图框(正方形),然后将图框及里面内容(坐标范围)保存为一dwg个文件.

33楼: 是的,但你的图框大小是固定的吗?我画图,图框是随着图的大小作相应的放大或缩小!
一般是A3或A4图框。我看你的图框也是有大有小!

34楼: 图框大小不是固定的,不知能否有判断的方法.还有没有其他的判断依据呢?

库存管理软件版35楼: 太好了,我也在作delphi开发autocad的东西,不过我做的比较简单,以前大富翁里没有人讨论这些东西。
qq:38476164

36楼: to mzr:你发的范例,我在D7下无法编译,但对我帮助很大,现在的问题不好解决啊!可否把你的Email或QQ留下,指点我一二,不胜感激!同时也希望各位感兴趣的朋友帮帮忙,指点思路!

37楼: 很好,不能沉底阿,顶

38楼: 很好,顶上去

39楼: to mzr:快来看看!现在还剩下最重要的一个问题:ch9中的selectonscreen命令中的
SelectionSets的使用,现在人机交换(在屏幕中)选择对象(点、线、文字)没搞懂,请指教。请留下你的Email交流?

40楼: 强烈关注~!
帮你顶!!

41楼: 看过VB做的类似于CAD软件,却没有看过DELPHI的。难道这一点DELPHI不如VB。

库存管理软件版42楼: 做的人很少!但有人做!而且肯定可以!希望得到先驱的帮助!

43楼: 新增加一个简单一点的问题:选择一个范围内的图元对象,startpoint,endpoint
我用select不知如何实现?在AutoCAD软件中的命令行中直接输入select可以直接选择
文提出在哪?欢迎感兴趣的朋友帮帮忙!

44楼: 是什么范围啊?矩形还是不规则形状?试过这个了吗?object.Select Mode[, Point1][, Point2][, FilterType][, FilterData]

45楼: 强烈关注,我也想做一个,大有继续讨论

46楼: To nansha:最近做了一个检查数据的程序,感觉运行速度奇慢,是哪里出了问题还是就这么慢啊?
程序的操作并不复杂,根据条件选取实体,在一个代码表里查询其编码(thickness)是否符合要求,不符合要求的地方画一个圆。代码表有700条数据,放在数组里,用折半查找,查找速度不成问题。关键是程序执行太慢,选择集中有640个实体,执行时间要36秒。机器是PIV 2.4G。
请问nansha你的情况如何啊?

47楼: to 风雨中:是矩形,object.Select Mode[, Point1][, Point2][, FilterType][, FilterData] ,你用过了吗?我使用了一下,不能选择,对[, FilterType][, FilterData]理解不够,不只如何使用,请指教,或有例程,diguandai@21cn.com

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

谢谢大家关注!周么忙,没上网!

48楼: 哈哈,最近也在搞相关AUTOCAD的问题,新人,加入哦;

库存管理软件版49楼: 按矩形选择的使用方法,函数定义:
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通迅速度慢的原因,因为对于现在的机器配置来说,一般的循环速度是相当快的。

50楼: 非常感谢风雨中回言!我试了,仍未通过,我是这样写的:
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编译通过,运行才出现上面的错误提示。

51楼: acSelectionSetWindow又如何定义呢?

52楼: 我说兄弟啊:那是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;

53楼: 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.
理解不够,我把练习代码贴出来,请你帮忙诊断指正!谢谢!

54楼: 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变量就没用了。

55楼: “可将AcadDoc的类型定义为IAcadDocument类型,相应的AcadApp也应定义为IAcadApplication类型”,改后调试不成,我把我的小练习发到nansha123@21cn.com(www.21cn.com),密码123456,你查收一下,麻烦帮我调试一下,谢谢!

库存管理软件版56楼: 你发给我的修改后的程序在你机子上可以编译通过吗?在我的计算机上编译不通过


,我的软件配置(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''
问题出在哪呢?第一次做,在接口问题上了解还不够!

57楼: 我当然是通过了才给你发的了。不过你说的问题我也不太清楚。我的是XP+D7+Cad2002,CAD版本应该不存在什么问题,我一直都是看CAD2004的帮助的。

58楼: 困惑?????我把机子上的AUTOCAD2004卸载后又装上AUTOCAD2002后,继续运行你修改后的例子,出现“未指定的错误”窗体!还是无法运行?何故呢?难道要重新装机再装AUTOCAD2002+D7?我觉得就是接口没对上,

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

acadApp,acadDoc:OleVariant;//我在一篇论文上看到的接口(我现在用)
这两个接口有什么不同之处,区别是什么?

59楼: 本质上的区别不清楚,但使用中还是有区别的,我只知道两点:


1、用OleVariant没有代码提示
2、用OleVariant在调用函数时可以使用缺省参数,这点有时还是挺有用的。
现在我是两种都用,如果不需要使用缺省参数晨当然要用ACAD定义的类型了,在需要使用缺省参数时就用OleVariant类型。

60楼: to 风雨中:多谢关注!问题还要解决,现在继续提前!可否留下你的QQ号?交流方便!

61楼: 好啊,不过我知道的也不多,有时间交流吧,251553183

62楼: To 风雨中:晚上你上网方便吗?最近办公室上网,不是很方便,正在打报告申请Hub,过两天就好了,我晚上在家上网很方便

库存管理软件版63楼: 晚上一般都可以

64楼: 再向大家提一个简单的问题:如何画一个带角度的线段?例如:起点(0,0),角度30度,长度500?

65楼: 画角度的直线实现了,先水平画直线,然后旋转即可。
又有个个新问题:我在画不规则四边形(知道4条边的长度和各个夹角)时,按角度画,存在Pi(3.1415926....)这个不精确问题,最后一条连线闭合不好,不知有没有好的方法,例如怎样实现最后一条线的连接采用对象捕捉等。

66楼: 新问题:在标注垂直直线时使用命令:AddDimAligned(startPoint,EndPoint,location),
如果标注带角度的直线使用AddDimAligned(startPoint,EndPoint,location)就不行了,但在AutoCAD2004中标注垂直直线用的是dimlinear命令,而标注倾斜直线用的是DimAligned命令,在AutoCAD的帮助文件中找不到dimlinear命令,只能找到DimAligned命令,帮助上DimAligned显示也是标注倾斜直线,可在我编写的程序中DimAligned则全是标注垂直直线的,不知标注倾斜直线如何实现的?

67楼: 又一次查看了帮助文件:解决了标注倾角的直线,使用命令
AddDimRotated(XLine1Point, XLine2Point, DimLineLocation, RotationAngle)可以实现,但显示的标注文字精确位数是4位小数,我想只要整数显示,不知如何实现?

68楼: 所有倾斜标注已解决,闭合问题也解决,主要是确定每个点的坐标即可。就是标注文字精确位数是4位小数,我想只要整数显示,不知如何实现?

69楼: to:nansha
请教delphi中怎样实现CAD中捕捉的功能?

PS:我最近要弄一个凸轮,用delphi绘制凸轮廓线,因为点数比较多,每次捕捉的坐标都有偏差,所以绘出来的图像就有点乱。

库存管理软件版70楼: to dhjs:最近1星期出差在外,刚回来。你说的对象捕捉是人机交互去捕捉?还是通过程序去捕捉某点?如果是通过程序,那相当于确定某点的坐标即可,这个就是存在偏差,我用到了cos(),sin(),存在Pi得误差,所以我闭合的也有偏差,放大了可以看清偏差,不放大,还可以。人机交互,我还没实现,不知如何实现?请指点。

71楼: 用Delphi来实现人机交互难度大,并且稳定性不好.
最好是使用与Autocad的专用语言+delphi....(个人见解)

72楼: to cancheung:人机交互是不好实现,但在mzr的例子中有一个可以选择CAD中元件的程序动作,我研究了,实现的方法和我不一样,他用的是AutoCAD_TLB,我没用到,我试着用了一下他的例子,没编译成功,不知问题出在哪?

73楼: to nansha:


留个电话,想和你谈谈合作 qq:540375526

74楼: 好啊!有钱大家挣!

75楼: 好像有个delphiARX2000是delphi下CAD二次开发控件包,有哪位用过吗?
不知道哪儿有破解版?

76楼: 我也下过delphiARX2000,没破解和说明,用不来,有用过的请跟贴交流一下。

库存管理软件版77楼: 用VC++开发AutoCAD是正当途径, delphi开发太弱. 开发接口:ObjectARX

78楼: 呵呵,VC++没学,探索Delphi,希望感兴趣的朋友们共同探索!

79楼: 大家是否看看我们的产品,脱离autocad,完全delphi源码.
TCAD
http://www.codeidea.com/cn/