乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 120|回复: 7

增强多段线教程-第7部分-在切线上获得夹点和关闭

[复制链接]

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-5-5 06:47:01 | 显示全部楼层 |阅读模式
为了与基于创建自定义实体的教程的精神保持一致,我认为一个不错的GUI与自定义实体进行交互,或者重构编写的代码,可能不是我能为它贡献的最后几天的最佳用法, 在过去的几周里,我一直被iPhone编程抨击,这让我感到唠叨,因为我没有把这个系列适当地结束,本期的代码添加了一些新功能,这为我们准备了下一个也可能是最后一个教程, 我将在这里保持简短的细节,因为代码应该相当不言自明, 在 EPlineDxf.cpp 和 .h 中要查找的新功能是列出重载的虚函数,显示 AcDbPolyline 属性以及我们添加到 EPlineDXF 的自定义属性, 正如您在前面的教程中回顾的那样,这些自定义属性是其自身图层上的偏移实体 (AcDbPolyline) 和偏移距离。
getGripPoints重载虚拟函数,新旧样式的getGripPoints都重载了, 新样式仅返回 eNotImplemented,而旧样式仅调用基本 getGripPoints 函数。
moveGripPoints在重载的虚拟函数中,新式和旧式的 moveGripPointsAt 都已重载, 新样式仅返回 eNotImplemented,并且所有自定义工作都以旧样式完成, 如果我有更多的时间,我会研究如何使用新样式的api,但现在这不是一个真正的选择, 查看旧样式函数以获取有关下一教程的提示。
GetSegmentFromGripPoints  实用程序函数从 moveGripPointsAt 调用,用于确定所选夹点的段和参数形式,告诉你这将是短暂的, 还有很多代码需要实现,所以我把它放在这里, 如果有人知道如何使用上面描述的新样式api函数,我会对细节感兴趣。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-5-5 08:52:10 | 显示全部楼层
真棒工作保罗!您的教程对我有很大帮助,谢谢。
我发现了几个小问题。列表中有一点中文,关机
违规
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-5-5 08:54:50 | 显示全部楼层
感谢您的提醒。我将确保在下一个版本中修复这些问题。
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-5-5 09:16:41 | 显示全部楼层
嘿,保罗,
你能解释一下什么是EnforcetangentDragging()吗?我见过具有用于处理拖动的mojo的样本和没有的样本。
谢谢
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-5-5 11:38:45 | 显示全部楼层
这是EPlineDxf的新标志。设置为true时,下一版本将强制拖动夹点,以保持拖动线段之间的相切。UI将用来打开和关闭它。我忘了提到这个标志,而且它还通过dwgInFields和dwgOutFields进行了序列化,并且版本控制也在增加。
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-5-5 14:20:21 | 显示全部楼层

我已经使用了这种新的风格,当我有机会的时候(如果仍然需要的话),我会尝试发布一些关于细节的东西,嗯,不要认为可以做出很多解释,我只是这样做了(就像许多东西一样,我也这样做)
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-5-12 01:02:32 | 显示全部楼层
实际上,这并不难,至少复制了旧方法。我所做的只是在 setAppData 中添加一些标识抓地力
的东西
  1. enum
  2.   {
  3.     kCenter = 10001,
  4.     kMidpointBottom = 10002,
  5.     kMidpointRight = 10003,
  6.     kMidpointTop = 10004,
  7.     kMidpointLeft= 10005,
  8.   };
  1. Acad::ErrorStatus MrxRectangle::getGripPoints( AcDbGripDataPtrArray& grips, const double curViewUnitSize,
  2.                                               const int gripSize,const AcGeVector3d& curViewDir,
  3.                                               const int bitflags ) const
  4. {
  5.   assertReadEnabled();
  6.   AcDbGripData *pGrpCenter = new AcDbGripData();
  7.   AcDbGripData *pGrpBottom = new AcDbGripData();
  8.   AcDbGripData *pGrpRight = new AcDbGripData();
  9.   AcDbGripData *pGrpTop = new AcDbGripData();
  10.   AcDbGripData *pGrpLeft = new AcDbGripData();
  11.   AcGePoint3d mpb;
  12.   AcGePoint3d mpr;
  13.   AcGePoint3d mpt;
  14.   AcGePoint3d mpl;
  15.   AcGePoint3d cp;
  16.   this->getMPB(mpb);
  17.   this->getMPR(mpr);
  18.   this->getMPT(mpt);
  19.   this->getMPL(mpl);
  20.   this->getCenter(cp);
  21.   pGrpCenter->setGripPoint(cp);
  22.   pGrpCenter->setAppData((void*)kCenter); // int 10001
  23.   pGrpBottom->setGripPoint(mpb);
  24.   pGrpBottom->setAppData((void*)kMidpointBottom); // int 10002
  25.   pGrpRight->setGripPoint(mpr);
  26.   pGrpRight->setAppData((void*)kMidpointRight); // int 10003
  27.   pGrpTop->setGripPoint(mpt);
  28.   pGrpTop->setAppData((void*)kMidpointTop); // int 10004
  29.   pGrpLeft->setGripPoint(mpl);
  30.   pGrpLeft->setAppData((void*)kMidpointLeft); // int 10004
  31.   grips.append(pGrpCenter);
  32.   grips.append(pGrpBottom);
  33.   grips.append(pGrpRight);
  34.   grips.append(pGrpTop);
  35.   grips.append(pGrpLeft);
  36.   return Acad::eOk;
  37. }
  1. Acad::ErrorStatus MrxRectangle::moveGripPointsAt( const AcDbVoidPtrArray& gripAppData,
  2.                                                  const AcGeVector3d& offset, const int bitflags )
  3. {
  4.   assertWriteEnabled();
  5.   if (gripAppData.length()== 0 || offset.isZeroLength())
  6.   {
  7.     return Acad::eOk;
  8.   }
  9.   for(int i = 0; i getPlane(plane,planarity);
  10.         AcGeVector2d offset2d = offset.convert2d(plane);
  11.         this->getPointAt(0,pt1);
  12.         this->getPointAt(1,pt2);
  13.         this->getPointAt(3,pt3);
  14.         AcGeVector2d x = pt1 - pt2;
  15.         AcGeVector2d y = pt3 - pt2;
  16.         if(offset2d.angleTo(y) setPointAt(0,pt1);
  17.         this->setPointAt(1,pt2);
  18.       }
  19.       break;
  20.     case kMidpointTop:
  21.       {
  22.         double length;
  23.         AcGePoint2d pt1,pt2,pt3;
  24.         AcGePlane plane;
  25.         AcDb::Planarity planarity;
  26.         this->getPlane(plane,planarity);
  27.         AcGeVector2d offset2d = offset.convert2d(plane);
  28.         this->getPointAt(2,pt1);
  29.         this->getPointAt(3,pt2);
  30.         this->getPointAt(0,pt3);
  31.         AcGeVector2d x = pt1 - pt2;
  32.         AcGeVector2d y = pt3 - pt2;
  33.         if(offset2d.angleTo(y) setPointAt(2,pt1);
  34.         this->setPointAt(3,pt2);
  35.       }
  36.       break;
  37.     case kMidpointRight:
  38.       {
  39.         double length;
  40.         AcGePoint2d pt1,pt2,pt3;
  41.         AcGePlane plane;
  42.         AcDb::Planarity planarity;
  43.         this->getPlane(plane,planarity);
  44.         AcGeVector2d offset2d = offset.convert2d(plane);
  45.         this->getPointAt(1,pt1);
  46.         this->getPointAt(2,pt2);
  47.         this->getPointAt(3,pt3);
  48.         AcGeVector2d x = pt1 - pt2;
  49.         AcGeVector2d y = pt3 - pt2;
  50.         if(offset2d.angleTo(y) setPointAt(1,pt1);
  51.         this->setPointAt(2,pt2);
  52.       }
  53.       break;
  54.     case kMidpointLeft:
  55.       {
  56.         double length;
  57.         AcGePoint2d pt1,pt2,pt3;
  58.         AcGePlane plane;
  59.         AcDb::Planarity planarity;
  60.         this->getPlane(plane,planarity);
  61.         AcGeVector2d offset2d = offset.convert2d(plane);
  62.         this->getPointAt(3,pt1);
  63.         this->getPointAt(0,pt2);
  64.         this->getPointAt(2,pt3);
  65.         AcGeVector2d x = pt1 - pt2;
  66.         AcGeVector2d y = pt3 - pt2;
  67.         if(offset2d.angleTo(y) setPointAt(3,pt1);
  68.         this->setPointAt(0,pt2);
  69.       }
  70.       break;
  71.     case kCenter:
  72.       {
  73.         transformBy(AcGeMatrix3d::translation(offset));
  74.       }
  75.       break;
  76.     }
  77.   }
  78.   return Acad::eOk;
  79. }

回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-5-12 09:48:32 | 显示全部楼层

我知道,你会明白的。。。。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-6 00:58 , Processed in 0.170659 second(s), 73 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表