pkohut 发表于 2009-5-5 06:47:01

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

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

pkohut 发表于 2009-5-5 08:52:10

真棒工作保罗!您的教程对我有很大帮助,谢谢。
我发现了几个小问题。列表中有一点中文,关机
违规

pkohut 发表于 2009-5-5 08:54:50

感谢您的提醒。我将确保在下一个版本中修复这些问题。

pkohut 发表于 2009-5-5 09:16:41

嘿,保罗,
你能解释一下什么是EnforcetangentDragging()吗?我见过具有用于处理拖动的mojo的样本和没有的样本。
谢谢

pkohut 发表于 2009-5-5 11:38:45

这是EPlineDxf的新标志。设置为true时,下一版本将强制拖动夹点,以保持拖动线段之间的相切。UI将用来打开和关闭它。我忘了提到这个标志,而且它还通过dwgInFields和dwgOutFields进行了序列化,并且版本控制也在增加。

pkohut 发表于 2009-5-5 14:20:21


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

pkohut 发表于 2009-5-12 01:02:32

实际上,这并不难,至少复制了旧方法。我所做的只是在 setAppData 中添加一些标识抓地力
的东西 enum
{
    kCenter = 10001,
    kMidpointBottom = 10002,
    kMidpointRight = 10003,
    kMidpointTop = 10004,
    kMidpointLeft= 10005,
};

Acad::ErrorStatus MrxRectangle::getGripPoints( AcDbGripDataPtrArray& grips, const double curViewUnitSize,
                                              const int gripSize,const AcGeVector3d& curViewDir,
                                              const int bitflags ) const
{
assertReadEnabled();
AcDbGripData *pGrpCenter = new AcDbGripData();
AcDbGripData *pGrpBottom = new AcDbGripData();
AcDbGripData *pGrpRight = new AcDbGripData();
AcDbGripData *pGrpTop = new AcDbGripData();
AcDbGripData *pGrpLeft = new AcDbGripData();
AcGePoint3d mpb;
AcGePoint3d mpr;
AcGePoint3d mpt;
AcGePoint3d mpl;
AcGePoint3d cp;
this->getMPB(mpb);
this->getMPR(mpr);
this->getMPT(mpt);
this->getMPL(mpl);
this->getCenter(cp);
pGrpCenter->setGripPoint(cp);
pGrpCenter->setAppData((void*)kCenter); // int 10001
pGrpBottom->setGripPoint(mpb);
pGrpBottom->setAppData((void*)kMidpointBottom); // int 10002
pGrpRight->setGripPoint(mpr);
pGrpRight->setAppData((void*)kMidpointRight); // int 10003
pGrpTop->setGripPoint(mpt);
pGrpTop->setAppData((void*)kMidpointTop); // int 10004
pGrpLeft->setGripPoint(mpl);
pGrpLeft->setAppData((void*)kMidpointLeft); // int 10004
grips.append(pGrpCenter);
grips.append(pGrpBottom);
grips.append(pGrpRight);
grips.append(pGrpTop);
grips.append(pGrpLeft);
return Acad::eOk;
}

Acad::ErrorStatus MrxRectangle::moveGripPointsAt( const AcDbVoidPtrArray& gripAppData,
                                                 const AcGeVector3d& offset, const int bitflags )
{
assertWriteEnabled();
if (gripAppData.length()== 0 || offset.isZeroLength())
{
    return Acad::eOk;
}
for(int i = 0; i getPlane(plane,planarity);
      AcGeVector2d offset2d = offset.convert2d(plane);
      this->getPointAt(0,pt1);
      this->getPointAt(1,pt2);
      this->getPointAt(3,pt3);
      AcGeVector2d x = pt1 - pt2;
      AcGeVector2d y = pt3 - pt2;
      if(offset2d.angleTo(y) setPointAt(0,pt1);
      this->setPointAt(1,pt2);
      }
      break;
    case kMidpointTop:
      {
      double length;
      AcGePoint2d pt1,pt2,pt3;
      AcGePlane plane;
      AcDb::Planarity planarity;
      this->getPlane(plane,planarity);
      AcGeVector2d offset2d = offset.convert2d(plane);
      this->getPointAt(2,pt1);
      this->getPointAt(3,pt2);
      this->getPointAt(0,pt3);
      AcGeVector2d x = pt1 - pt2;
      AcGeVector2d y = pt3 - pt2;
      if(offset2d.angleTo(y) setPointAt(2,pt1);
      this->setPointAt(3,pt2);
      }
      break;
    case kMidpointRight:
      {
      double length;
      AcGePoint2d pt1,pt2,pt3;
      AcGePlane plane;
      AcDb::Planarity planarity;
      this->getPlane(plane,planarity);
      AcGeVector2d offset2d = offset.convert2d(plane);
      this->getPointAt(1,pt1);
      this->getPointAt(2,pt2);
      this->getPointAt(3,pt3);
      AcGeVector2d x = pt1 - pt2;
      AcGeVector2d y = pt3 - pt2;
      if(offset2d.angleTo(y) setPointAt(1,pt1);
      this->setPointAt(2,pt2);
      }
      break;
    case kMidpointLeft:
      {
      double length;
      AcGePoint2d pt1,pt2,pt3;
      AcGePlane plane;
      AcDb::Planarity planarity;
      this->getPlane(plane,planarity);
      AcGeVector2d offset2d = offset.convert2d(plane);
      this->getPointAt(3,pt1);
      this->getPointAt(0,pt2);
      this->getPointAt(2,pt3);
      AcGeVector2d x = pt1 - pt2;
      AcGeVector2d y = pt3 - pt2;
      if(offset2d.angleTo(y) setPointAt(3,pt1);
      this->setPointAt(0,pt2);
      }
      break;
    case kCenter:
      {
      transformBy(AcGeMatrix3d::translation(offset));
      }
      break;
    }
}
return Acad::eOk;
}

pkohut 发表于 2009-5-12 09:48:32


我知道,你会明白的。。。。
页: [1]
查看完整版本: 增强多段线教程-第7部分-在切线上获得夹点和关闭