明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1918|回复: 1

梦想绘图控件编程技术专贴

[复制链接]
发表于 2010-12-28 15:58:09 | 显示全部楼层 |阅读模式
本帖最后由 mxdwg 于 2010-12-29 09:29 编辑

后面会不停更新使用梦想控件中objectarx编程接口和Vba编程接口的例程代码,主要是一些常用功能的函数代码,
例程的代码的编译运行需要控件库才行,最新控件库下载连接:http://www.mxdraw.com/?p=9,技术交流QQ群:112199959

VC: 遍历当前块表记录中的所有实体,并修改颜色的代码
  1.    void ModifyAllEntity()
  2.     {
  3.         // 下面读取图中指定块的属性。
  4.         McDbBlockTableRecordPointer spBlkRec(MCDB_MODEL_SPACE,
  5.             acdbCurDwg(),McDb::kForRead);

  6.         if(spBlkRec.openStatus() != Mcad::eOk)
  7.         {
  8.             return;
  9.         }

  10.         // 生成遍历数据库用的遍历器.
  11.         McDbBlockTableRecordIterator* pIterator = NULL;
  12.         spBlkRec->newIterator(pIterator);

  13.         if(pIterator == NULL)
  14.             return;

  15.         std::auto_ptr<McDbBlockTableRecordIterator> spIter(pIterator);

  16.         // 遍历数据库

  17.         for(;!pIterator->done();pIterator->step() )
  18.         {
  19.             McDbObjectId id;
  20.             pIterator->getEntityId(id);

  21.             McDbObjectPointer<AcDbEntity> spEntity(id,McDb::kForWrite);
  22.             if(spEntity.openStatus() != Mcad::eOk)
  23.                 continue;

  24.             spEntity->setColorIndex(MrxDbgUtils::kWhite);

  25.             if(McDbLine::cast(spEntity.object()) != NULL)
  26.             {
  27.                 // 是个直线实体
  28.                 McDbLine* pLine = McDbLine::cast(spEntity.object());
  29.             }
  30.             else if(McDbArc::cast(spEntity.object()) != NULL)
  31.             {
  32.                 // 是个圆弧实体
  33.                 McDbArc* pArc = McDbArc::cast(spEntity.object());
  34.             }
  35.             else if(McDbText::cast(spEntity.object()) != NULL)
  36.             {
  37.                 // 是个文字实体
  38.                 McDbText* pText = McDbText::cast(spEntity.object());
  39.             }
  40.             /*
  41.             else if... ...
  42.             */

  43.         }
  44.     }
复制代码
VB6代码,得到图纸空间中所有实体
  1. '得到当前图纸空间中所有实体的代码演示
  2. '当前的图纸空间
  3. Dim curSpace8 As MxDrawXLib.MxDrawBlockTableRecord
  4. Set curSpace8 = app.WorkingDatabase.CurrentSpace

  5. ' 工具对象,用于向命令行输入出字符串
  6. Dim mxUtility8 As MxDrawXLib.MxDrawUtility
  7. Set mxUtility8 = New MxDrawXLib.MxDrawUtility

  8. '遍历器,用于遍历当前图纸空间中所有的实体
  9. Dim iter As MxDrawXLib.MxDrawBlockTableRecordIterator
  10. Set iter = curSpace8.NewIterator

  11. Dim ptDim1 As MxDrawXLib.MxDrawPoint
  12. Dim ptDim2 As MxDrawXLib.MxDrawPoint

  13. If (iter Is Nothing) Then
  14. Exit Sub
  15. End If

  16. '循环得到所有实体
  17. Do While iter.Done = False
  18. ' 得到遍历器当前的实体
  19. Dim ent8 As MxDrawXLib.MxDrawEntity
  20. Set ent8 = iter.GetEntity()

  21. If (ent8 Is Nothing) = False Then
  22. If TypeOf ent8 Is MxDrawXLib.MxDrawText Then
  23. '当前实体是个文字实体
  24. Dim text8 As MxDrawXLib.MxDrawText
  25. Set text8 = ent8
  26. mxUtility8.Prompt Chr(13) + Chr(10) + text8.TextString
  27. ElseIf TypeOf ent8 Is MxDrawXLib.MxDrawPolyline Then
  28. '当前实体是一个多义线
  29. Dim polyline As MxDrawXLib.MxDrawPolyline
  30. Set polyline = ent8

  31. mxUtility8.Prompt Chr(13) + Chr(10) + "发现Polyline曲线, 下面是它的坐标信息:"
  32. '得到Polyline的端点坐标

  33. Dim iNum As Long
  34. iNum = 0
  35. Do While iNum < polyline.NumVerts

  36. Dim tmpPt As MxDrawXLib.MxDrawPoint
  37. Set tmpPt = polyline.GetPointAt(iNum)

  38. mxUtility8.Prompt Chr(13) + Chr(10) + "坐标为x:" & tmpPt.x & "y:" & tmpPt.y & "凸度为:" & polyline.GetBulgeAt(iNum)


  39. iNum = iNum + 1
  40. Loop


  41. ElseIf TypeOf ent8 Is MxDrawXLib.MxDrawDimAligned Then

  42. Dim dimAligned8 As MxDrawXLib.MxDrawDimAligned
  43. Set dimAligned8 = ent8

  44. mxUtility8.Prompt Chr(13) + Chr(10) + dimAligned8.DimensionText
  45. '当DimensionText返回为空时,可以用下面的ptDim1,ptDim2两点的距离算出标注内容。
  46. Set ptDim1 = dimAligned8.XLine1Point
  47. Set ptDim2 = dimAligned8.XLine2Point

  48. ElseIf TypeOf ent8 Is MxDrawXLib.MxDrawDimRotated Then

  49. Dim dimRotated8 As MxDrawXLib.MxDrawDimRotated
  50. Set dimRotated8 = ent8

  51. mxUtility8.Prompt Chr(13) + Chr(10) + dimRotated8.DimensionText
  52. '当DimensionText返回为空时,可以用下面的ptDim1,ptDim2两点的距离算出标注内容。
  53. Set ptDim1 = dimRotated8.XLine1Point
  54. Set ptDim2 = dimRotated8.XLine2Point
  55. ' ElseIf TypeOf ent8 Is 其它类型 Then
  56. ' ... ...

  57. End If

  58. End If
  59. iter.Step
  60. Loop
C#代码,得到图纸空间中所有实体
  1. private void GetAllEntity()
  2. {
  3. try
  4. {

  5. MxDrawApplication app = new MxDrawApplication();
  6. MxDrawUtility mxUtility = new MxDrawUtility();

  7. // 得到当前图纸空间
  8. MxDrawBlockTableRecord blkRec = app.WorkingDatabase().CurrentSpace();

  9. // 创建一个用于遍历当前图纸空间的遍历器
  10. MxDrawBlockTableRecordIterator iter = blkRec.NewIterator();
  11. if (iter == null)
  12. return;

  13. // 所有实体的id数组。
  14. List<Int32> aryId = new List<Int32>();

  15. int iLineNum = 0;
  16. // 循环得到所有实体

  17. for (; !iter.Done(); iter.Step(true, false))
  18. {
  19. // 得到遍历器当前的实体
  20. MxDrawEntity ent = iter.GetEntity();
  21. if (ent == null)
  22. continue;

  23. // 得到实体的id
  24. aryId.Add(ent.ObjectID);

  25. if (ent is MxDrawLine)
  26. {
  27. // 当前实体是一个直线
  28. MxDrawLine line = (MxDrawLine)ent;
  29. iLineNum++;
  30. }
  31. else if (ent is MxDrawBlockReference)
  32. {
  33. // 当前实体是一个块引用
  34. MxDrawBlockReference blkRef = (MxDrawBlockReference)ent;
  35. for (int j = 0; j < blkRef.AttributeCount; j++)
  36. {
  37. // 得到块引用中所有的属性
  38. MxDrawAttribute attrib = blkRef.AttributeItem(j);
  39. mxUtility.Prompt("n Tag: " + attrib.Tag + "Text:" + attrib.TextString);
  40. }

  41. }
  42. // else if (ent is 其它类型)
  43. //{
  44. // ... ....
  45. //}
  46. }

  47. String sT;
  48. sT = "发现" + aryId.Count + "个实体,其中有" + iLineNum + "个直线";
  49. MessageBox.Show(sT);
  50. }
  51. catch (Exception ex)
  52. {

  53. MessageBox.Show(ex.Message.ToString());
  54. }
  55. }
Delphi中的例程,遍历图中的所有实体,找到块名为A23TIT_KH的图块,并得到它的属性
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. curDababase : IMxDrawDatabase;
  4. modleSpace : IMxDrawBlockTableRecord ;
  5. newIterator : IMxDrawBlockTableRecordIterator ;
  6. pEnt : IMxDrawEntity;
  7. pBlkRef : IMxDrawBlockReference;
  8. pAttribute : IMxDrawAttribute;
  9. tag : WideString;
  10. text : WideString;
  11. ii : Integer;

  12. fModel : WideString;
  13. fTitle : WideString;
  14. fDwgNo : WideString;
  15. fMaterial : WideString;
  16. fQuantity : WideString;
  17. fRemark : WideString;
  18. fDrawData : WideString;
  19. fScale : WideString;
  20. fVersion : WideString;
  21. fReview : WideString;
  22. fDrawName : WideString;
  23. fApprove : WideString;
  24. begin
  25. curDababase := MxDrawApplication1.WorkingDatabase;
  26. modleSpace := curDababase.CurrentSpace ;
  27. newIterator := modleSpace.NewIterator ;
  28. if newIterator <> nil then
  29. begin
  30. while newIterator.Done() = False do
  31. begin
  32. pEnt := newIterator.GetEntity();
  33. newIterator.Step(True,False);
  34. if pEnt <> nil then
  35. begin

  36. pEnt.QueryInterface(IMxDrawBlockReference, pBlkRef);
  37. if pBlkRef <> nil then
  38. begin
  39. if pBlkRef.GetBlockName() = 'A23TIT_KH' then
  40. begin
  41. for ii := 0 to pBlkRef.AttributeCount -1 do
  42. begin
  43. pAttribute := pBlkRef.AttributeItem(ii);
  44. tag := pAttribute.Get_Tag();
  45. text := pAttribute.Get_TextString();
  46. showmessage(tag + ':' + text);
  47. case ii of
  48. 0: fModel := text;
  49. 1: fTitle := text;
  50. 2: fDwgNo := text;
  51. 3: fMaterial := text;
  52. 4: fQuantity := text;
  53. 5,6,7: fRemark := fRemark + text + ' ';
  54. 8: fDrawData := text;
  55. 9: fScale := text;
  56. 10: fVersion := text;
  57. 11: fReview := text;
  58. 12: fDrawName := text;
  59. 13: fApprove := text;
  60. end;
  61. end;
  62. end;
  63. end;
  64. end;
  65. end;
  66. end;

  67. if text = '' then
  68. begin
  69. showmessage('没有发现块名为' + 'A23TIT_KH' + '的块实体');
  70. end;
  71. end;
复制代码

 楼主| 发表于 2010-12-28 16:06:30 | 显示全部楼层
本帖最后由 mxdwg 于 2010-12-28 16:08 编辑

圆弧的凸度参数说明
圆弧的凸度计算如下图:


计算程序:

复制代码
  1. // 由圆弧的开始点,结束点,凸度,计算圆弧的中心点
  2. bool GetArcCenter(McGePoint3d startPoint,McGePoint3d endPoint,double bulge,McGePoint3d& center)
  3. {
  4.     if (bulge==0.0)
  5.     {
  6.         center = startPoint;
  7.         return false;
  8.     }

  9.     if (bulge < 0.0)
  10.     {
  11.         McGePoint3d tmpPt    =    endPoint;
  12.         endPoint            =    startPoint;
  13.         startPoint            =    tmpPt;
  14.         bulge                =    -bulge;
  15.     }

  16.     // 计算圆弧的半径

  17.     double dDX,dDY,dR;
  18.     dDX    =    startPoint.distanceTo(endPoint) / 2.0;
  19.     dDY    =    bulge    *    dDX;
  20.     dR    =    ((dDX*dDX)+(dDY*dDY)) / (2.0 * dDY);

  21.     // 计算圆弧的中心点
  22.     double tmpAng;
  23.     ads_point tmpPt;
  24.     tmpAng    =    Mx::mcutAngle(startPoint,endPoint);

  25.     Mx::mcutPolar(asDblArray(startPoint),tmpAng,dDX,tmpPt);
  26.     ads_point tmpCenter;
  27.     Mx::mcutPolar(tmpPt,(tmpAng + (3.14159265 / 2.0) ),(dR-dDY),tmpCenter);
  28.     center = asPnt3d(tmpCenter);

  29.     return true;
  30. };


复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 11:37 , Processed in 0.187491 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表