找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 926|回复: 7

[求助] 关于自定义实体

[复制链接]
发表于 2017-9-9 11:31:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
各位大师,我看了帮助文档里面的例子,这个实在搞不懂,这里的addDimData,setDimValue干啥用的,有啥效果,哪位大师帮看下

extern int gCircleDynDimSetting;
AcCircleJig::AcCircleJig(AcDbDatabase *pDb,
             AcCircle *pCircle):
mpCircle(pCircle),
mpdb(pDb)
{
mElevation = 0.0;
mNormal.set(0,0,1);
mpDimDataArray = new AcDbDimDataPtrArray;
mpDimDataArray->setLogicalLength(0);
}
AcCircleJig::~AcCircleJig()
{
if (mpDimDataArray)
{
  for (int i = 0; i < mpDimDataArray->length(); i++)
  {
   AcDbDimData *pData = (*mpDimDataArray)[i];
   delete pData;
  }
  delete mpDimDataArray;
}
}
Acad::ErrorStatus
AcCircleJig::setPlane()
{
// Acquire current UCS transformation matrix.
// We save the matrix for later use.
//
acdbUcsMatrix(mUcsToWcsMat);
mWcsToUcsMat = mUcsToWcsMat.inverse();
// Get data from user coordinate system.
//
AcGePoint3d orgPt;
AcGeVector3d xAxis, yAxis, zAxis;
mUcsToWcsMat.getCoordSystem(orgPt, xAxis, yAxis, zAxis);
// Get the current elevation w.r.t current UCS, w.r.t the current space.
//
struct resbuf rb;
ads_getvar(/*MSG0*/"CVPORT", &rb);
double elev;
if (rb.resval.rint == 1)
  elev = mpdb->pelevation();  // Paper space
else
  elev = mpdb->elevation();   // Model space
// Convert elevation from UCS to WCS.
//
orgPt += elev * zAxis;
mElevation = zAxis.dotProduct(orgPt.asVector());
mNormal = zAxis;
mHorizDir = xAxis;
return Acad::eOk;
}
//Purpose: This is the fist function that that command is
//         expected to call. This would call the other drag()
//     method classes.
void   
AcCircleJig::dragIt(void)
{
AcEdJig::DragStatus stat;
const TCHAR* pszPrompt = _T("Enter the center for the Circle");
setDispPrompt(pszPrompt);
stat =acquireDefPt();
setCircleProperties();
do
{
  const TCHAR*pszPrompt2 = _T("Enter the Radius point for the circle");
  setDispPrompt(pszPrompt2);
  addDimData();
  stat = drag();
} while (stat != AcEdJig::kNormal && stat != AcEdJig::kCancel &&
  stat != AcEdJig::kNull);

if (stat == AcEdJig::kNormal)
  append();
}
AcEdJig::DragStatus
AcCircleJig::acquireDefPt()
{
DragStatus stat;
setUserInputControls( (UserInputControls)
  (AcEdJig::kAccept3dCoordinates |
  AcEdJig::kNoNegativeResponseAccepted)
  );
AcGePoint3d pt;
stat =acquirePoint(pt);
if(mCenterPt != pt)
  mCenterPt=pt;
if(stat == AcEdJig::kNormal )
  return AcEdJig::kNoChange;
else
  return stat;
}
AcEdJig::DragStatus   
AcCircleJig::sampler(void)
{
DragStatus stat;
setUserInputControls((UserInputControls)
  (AcEdJig::kAccept3dCoordinates
  | AcEdJig::kGovernedByOrthoMode
  | AcEdJig::kAcceptOtherInputString  
  | AcEdJig::kNoNegativeResponseAccepted
  | AcEdJig::kNullResponseAccepted
  | AcEdJig::kNoZeroResponseAccepted));

AcGePoint3d pnt;
stat = acquirePoint(pnt);
if (stat == kNormal) {
  if (pnt == mRadVec){
   return AcEdJig::kNoChange;
  }
  else{
   mRadVec = pnt;
  }
}
return stat;
}

Adesk::Boolean
AcCircleJig::update()
{
AcGeVector3d radVec = mRadVec - mCenterPt;
double radius = radVec.length();
mpCircle->setRadius(radius);
//update the Dynamic Dimension
updateDimension();
return Adesk::kTrue;
}
void      
AcCircleJig::setCircleProperties()
{
mpCircle->setDatabaseDefaults();
mpCircle->setCenter(mCenterPt);
mpCircle->setNormal(mNormal);
}
bool      
AcCircleJig::updateDimension()
{
if (!mpCircle || !mpDimDataArray ||
  (mpDimDataArray->length() <= 0))
  return false;
double radius = mpCircle->radius();
AcGePoint3d cenPt = mpCircle->Center();
AcGeVector3d radVec = mRadVec - cenPt;
if (!radVec.isZeroLength())
{
  radVec.normalize();
  radVec = radius * radVec;
}
AcGePoint3d chordPt = cenPt + radVec;
AcGePoint3d farChordPt = cenPt - radVec;
for (int i = 0; i < mpDimDataArray->length(); i++)
{
  AcDbDimData *pData = (*mpDimDataArray)[i];
  int iAppData = *( static_cast<int *>(pData->appData()) );
  AcDbDimension *pDim = (AcDbDimension*)pData->dimension();
  AcDbAlignedDimension *pAlnDim = AcDbAlignedDimension::cast(pDim);
  if (pAlnDim == NULL)
   continue;
  pAlnDim->setXLine1Point(cenPt);
  pAlnDim->setXLine2Point(chordPt);
  pAlnDim->setDimLinePoint(chordPt);
}
return true;
}
AcDbDimDataPtrArray*
AcCircleJig::dimData(const double dimScale)
{
return mpDimDataArray;
}
Acad::ErrorStatus
AcCircleJig::setDimValue(const AcDbDimData *pdimData,
             const double dimValue)
{
mpCircle->setRadius(dimValue);
return Acad::eOk;
}
bool
AcCircleJig::addDimData()
{
if (mpCircle == NULL)
  return false;
if (mpDimDataArray == NULL) {
  mpDimDataArray = new AcDbDimDataPtrArray();
} else {
  for (int i = 0; i < mpDimDataArray->length(); i++) {
   AcDbDimData *pData = (*mpDimDataArray)[i];
   delete pData;
  }
  mpDimDataArray->setLogicalLength(0);
}
double radius = mpCircle->radius();
AcGePoint3d cenPt = mpCircle->Center();
AcGeVector3d normal = mpCircle->normal();
AcGeVector3d vertDir = normal.crossProduct(mHorizDir);
AcDbAlignedDimension *pAlnDim1 = new AcDbAlignedDimension();
pAlnDim1->setDatabaseDefaults();
pAlnDim1->setNormal(normal);
pAlnDim1->setElevation(mElevation);
pAlnDim1->setDimsah(true);
pAlnDim1->setDimse1(true);
pAlnDim1->setDimblk1(_T("None"));
pAlnDim1->setXLine1Point(mCenterPt);
pAlnDim1->setXLine2Point(mRadVec);
pAlnDim1->setDimLinePoint(mRadVec);
AcDbDimData *dimData1 = new AcDbDimData(pAlnDim1);
int DimIndex(1);
dimData1->setAppData(&DimIndex);
// check what the setting is for this dimension
// this is configured using the SETDYNDIMMODES command
getDynDimSettings(dimData1, (AcDbDimData::DimDataFlags)gCircleDynDimSetting);
mpDimDataArray->append(dimData1);
return true;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2017-9-9 14:58:54 | 显示全部楼层
本帖最后由 why1025 于 2017-9-9 15:01 编辑

没人了啊11111111,谁知道
virtual AcDbDimDataPtrArray* dimData(const double dimScale);
bool       updateDimension();
DragStatus      acquireDefPt();
virtual Acad::ErrorStatus setDimValue(const AcDbDimData *pdimData,
            const double dimValue);
bool      addDimData();
这些最终做出的效果是什么,如何添加这些
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-9 15:17:52 | 显示全部楼层
其实我的问题是这样的,我现在自定义一个实体后,可以实现动态创建,但是现在问题是如果创建了尺寸,用acedjig有问题,不知各位大师怎么处理尺寸的动态创建拖动的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2017-9-9 18:44:13 | 显示全部楼层
你这不是自定义实体,是动态拖动,自己动手在CAD里面画标注, 看到拉动边线了吗,这个就是程序做这个的。多看下例子目录里面的代码。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-9 18:52:56 | 显示全部楼层
本帖最后由 why1025 于 2017-9-9 18:56 编辑

是动态拖动,但现在问题是拖动的实体是尺寸,好像不能动态拖动尺寸。比如一个矩形,我标注边长以后,可以拖动这个矩形,但是尺寸不能拖,不知这个问题有什么解决方法没,我现在想知道我这个例子里的关于尺寸的那几个函数是不是处理这个问题的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2017-9-9 19:20:19 | 显示全部楼层

是做DIM拖动的,你要修改代码,去设置xlinepont1,xlinepont2那些值。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-9 19:27:01 | 显示全部楼层
youyouyou有没有例子啊,想看看,而且这个是拖动一堆实体,不是一个
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-9 20:14:23 | 显示全部楼层
大神们都干啥去了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 17:34 , Processed in 0.364063 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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