找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 890|回复: 15

[求助]

[复制链接]
发表于 2017-8-3 11:50:09 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 why1025 于 2017-8-3 11:54 编辑

各位大师,拖动实体时,如果按了esc,取消,想让实体回到原位,这个没问题,接下来,再选这组实体,拖动时,能选上,但拖动不了,这是上次拖动实体实体写入出了问题吗,因为这以后cad提示, 写入关闭文件时出错
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-8-3 11:56:01 | 显示全部楼层
开发,用代码说话。
你运行不对,肯定是你代码有问题了,你这样问问题,谁都只能回答你代码写错了。

回到你的问题,不讨论拖动,你手动能选择到你拖动后的实体吗? 选下,删除下试试。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-3 12:01:09 | 显示全部楼层
我拖动的命令能选上,但是我单独直接选已经选不上了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-8-3 12:04:35 | 显示全部楼层

存盘,看提示错误不,如果提示你对象已经打开写什么,就是你没关闭对象。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-3 12:09:24 | 显示全部楼层
本帖最后由 why1025 于 2017-8-3 13:20 编辑




  1. #include "mulentityjig.h"
  2. #include "Steel.h"

  3. CMulEntity::CMulEntity(AcDbObjectIdArray ObiectIds,const AcGePoint3d startPoint, double width, double height,bool isRotated/*=true*/,double Scale/*=1.0*/)
  4. {
  5.         m_startPoint = startPoint;
  6.         //m_endPoint = endPoint;
  7.         m_width = width;
  8.         m_height = height;
  9.         m_bPosition=3;
  10.         m_bisRotated=isRotated;
  11.         m_bScale=Scale;
  12.         m_bLastPoint=true;
  13.         m_ObiectIdsArr=ObiectIds;
  14.         
  15.         
  16.         
  17.         for (int i = 0; i <ObiectIds.length(); i++)
  18.         {
  19.                 AcDbEntity *pEntity=NULL;
  20.                 AcDbPolyline * pPoly=NULL;
  21.                 AcDbLine *pLine=NULL;
  22.                 AcDbText *pText=NULL;
  23.                 Acad::ErrorStatus es=acdbOpenObject(pEntity,ObiectIds[i],AcDb::kForWrite);
  24.                 if (es==Acad::eOk)
  25.                 {
  26.                         if (pEntity->isKindOf(AcDbLine::desc()))
  27.                         {
  28.                                 pLine=AcDbLine::cast(pEntity);
  29.                                 m_LineArr.append(pLine);
  30.                         }else if (pEntity->isKindOf(AcDbPolyline::desc()))
  31.                         {
  32.                                 pPoly=AcDbPolyline::cast(pEntity);
  33.                                 m_PolylineArr.append(pPoly);
  34.                         }
  35.                         else if (pEntity->isKindOf(AcDbText::desc()))
  36.                         {
  37.                                 pText=AcDbText::cast(pEntity);
  38.                                 m_TextArr.append(pText);
  39.                         }else
  40.                         {
  41.                         }
  42.                 }

  43.                
  44.                
  45.         }
  46.         
  47.         
  48.         
  49.         
  50.         
  51. }

  52. CMulEntity::~CMulEntity(void)
  53. {
  54.         /*for (int i = 0; i < m_PolylineArr.length(); i++)
  55.         {
  56.                 delete m_PolylineArr[i];
  57.         }
  58.         for (int i = 0; i < m_LineArr.length(); i++)
  59.         {
  60.                 delete m_LineArr[i];
  61.         }
  62.         for (int i = 0; i < m_TextArr.length(); i++)
  63.         {
  64.                 delete m_TextArr[i];
  65.         }*/
  66. }

  67. Adesk::Boolean CMulEntity::subWorldDraw( AcGiWorldDraw* mode )
  68. {
  69.         for (int i = 0; i < m_PolylineArr.length(); i++)
  70.         {
  71.                 mode ->geometry().draw(m_PolylineArr[i]);
  72.         }
  73.         for (int i = 0; i < m_TextArr.length(); i++)
  74.         {
  75.                 mode ->geometry().draw(m_TextArr[i]);
  76.         }
  77.         for (int i = 0; i < m_LineArr.length(); i++)
  78.         {
  79.                 mode ->geometry().draw(m_LineArr[i]);
  80.         }
  81.         //注意,尺寸在这个重画函数里就会崩溃
  82.         /*for (int i = 0; i < m_RotatedDimArr.length(); i++)
  83.         {
  84.                 mode ->geometry().draw(m_RotatedDimArr[i]);
  85.         }*/
  86.         return (AcDbEntity::subWorldDraw (mode)) ;
  87. }



  88. void CMulEntity::SetEndPoint( const AcGePoint3d &pt )
  89. {
  90.         // 这句代码能引发worldDraw函数的调用
  91.         //assertWriteEnabled();
  92.         if (m_PolylineArr.length() <= 0&&m_LineArr.length() <= 0&&m_TextArr.length() <= 0)return;
  93.         m_endPoint = pt;
  94.         AcGeVector2d v1=CSteel::ToPoint2d(m_endPoint)-CSteel::ToPoint2d(m_startPoint);
  95.         AcGeVector3d v3;
  96.         if (m_bLastPoint)
  97.         {
  98.                 m_lastPoint = pt;
  99.                 v3=pt-m_startPoint;;
  100.                 m_bLastPoint=false;
  101.         }else{
  102.                 v3=pt-m_lastPoint;
  103.         }
  104.         
  105.         double ang1=v1.angle();
  106.         AcGeMatrix3d xform;
  107.         AcGeVector3d vec(0,0,1);
  108.         
  109.         if (m_bisRotated)
  110.         {
  111.                 acutPrintf(_T("%d"),m_bPosition);
  112.                 if (ang1<=0.75*CSteel::PI()&&ang1>=0.25*CSteel::PI())
  113.                 {

  114.                 }else if (ang1<=1.25*CSteel::PI()&&ang1>0.75*CSteel::PI())
  115.                 {
  116.                         


  117.                 }else if (ang1<=1.75*CSteel::PI()&&ang1>1.25*CSteel::PI())
  118.                 {
  119.                         


  120.                 }else{

  121.                 }
  122.         }
  123.       


  124.         
  125.         
  126. }

  127. void CMulEntity::appendToCurrentSpace()
  128. {
  129.         AcDbDatabase *pDb=acdbCurDwg();
  130.         AcDbBlockTable *pBlockTable;
  131.         pDb ->getBlockTable(pBlockTable, AcDb::kForRead);
  132.         AcDbBlockTableRecord *pBlkRec;
  133.         if (pDb ->tilemode())
  134.         {
  135.                 pBlockTable ->getAt(ACDB_MODEL_SPACE, pBlkRec, AcDb::kForWrite);
  136.         }
  137.         else
  138.         {                  
  139.                 pBlockTable ->getAt(ACDB_PAPER_SPACE, pBlkRec, AcDb::kForWrite);
  140.         }
  141.         pBlockTable ->close();
  142.         for (int i = 0; i < m_PolylineArr.length(); i++)
  143.         {
  144.                 AcDbPolyline * pPoly = m_PolylineArr.at(i);
  145.                 if (pPoly!= NULL)
  146.                 {
  147.                         pPoly ->close();        
  148.                 }
  149.                 else{
  150.                         delete pPoly;
  151.                 }

  152.         }
  153.         for (int i = 0; i < m_TextArr.length(); i++)
  154.         {
  155.                 AcDbText * pText = m_TextArr.at(i);
  156.                 if (pText!= NULL)
  157.                 {
  158.                         pText ->close();        
  159.                 }
  160.                 else{
  161.                         delete pText;
  162.                 }
  163.         }
  164.         for (int i = 0; i < m_LineArr.length(); i++)
  165.         {
  166.                 AcDbLine * pLine = m_LineArr.at(i);
  167.         
  168.                 if (pLine!= NULL)
  169.                 {
  170.                         pLine ->close();
  171.                 }
  172.                 else{
  173.                         delete pLine;
  174.                 }
  175.         }
  176.         
  177.         pBlkRec ->close();
  178.         m_PolylineArr.removeAll();
  179.         m_TextArr.removeAll();
  180.         m_LineArr.removeAll();

  181. }



  182. #include "mulentityjig.h"

  183. //CMulEntityJig::CMulEntityJig(void)
  184. //{
  185. //}
  186. //
  187. //CMulEntityJig::~CMulEntityJig(void)
  188. //{
  189. //}
  190. CMulEntityJig::CMulEntityJig(AcDbObjectIdArray ObiectIds,const AcGePoint3d startPoint, double width, double height,bool isRotated/*=true*/,double Scale/*=1.0*/) :
  191. m_ObiectIdsArr(ObiectIds), m_startPoint(startPoint),m_width(width), m_height(height), m_bisRotated(isRotated), m_bScale(Scale)  {          }  

  192. AcEdJig::DragStatus CMulEntityJig::sampler()
  193. {          setUserInputControls((UserInputControls)
  194.                                                  (AcEdJig::kAccept3dCoordinates
  195.                                                  | AcEdJig::kNoNegativeResponseAccepted
  196.                                                  | AcEdJig::kNullResponseAccepted));
  197. static AcGePoint3d pointTemp;
  198. DragStatus stat = acquirePoint(m_curPoint);

  199. if (pointTemp != m_curPoint)
  200. {
  201.         pointTemp = m_curPoint;
  202. }
  203. else if (stat == AcEdJig::kNormal)
  204. {
  205.         return AcEdJig::kNoChange;
  206. }

  207. return stat;
  208. }

  209. Adesk::Boolean  CMulEntityJig::update()
  210. {         
  211.         m_pEnt ->SetEndPoint(m_curPoint);
  212.         return Adesk::kTrue;  
  213. }
  214. AcDbEntity * CMulEntityJig::entity() const
  215. {          return m_pEnt;  }  

  216. void CMulEntityJig::doIt(  )
  217. {  

  218.         m_pEnt = new CMulEntity(m_ObiectIdsArr,m_startPoint, m_width, m_height,m_bisRotated,m_bScale); //这个构造参数不对
  219.         setDispPrompt(_T("\n最终点: "));         
  220.           if (drag() == AcEdJig::kNormal)  
  221.         {                          
  222.                  m_pEnt ->appendToCurrentSpace();        
  223.         }                  
  224.         delete m_pEnt;  
  225. }
[/code]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-8-3 12:16:30 | 显示全部楼层
本帖最后由 LoveArx 于 2017-8-3 12:19 编辑

why1025 发表于 2017-8-3 12:09

for (int i = 0; i <ObiectIds.length(); i++)
        {
                AcDbEntity *pEntity=NULL;
                AcDbPolyline * pPoly=NULL;
                AcDbLine *pLine=NULL;
                AcDbText *pText=NULL;
                Acad::ErrorStatus es=acdbOpenObject(pEntity,ObiectIds,AcDb::kForWrite);
                if (es==Acad::eOk)
                {
                        if (pEntity->isKindOf(AcDbLine::desc()))
                        {
                                pLine=AcDbLine::cast(pEntity);
                                m_LineArr.append(pLine);
                        }else if (pEntity->isKindOf(AcDbPolyline::desc()))
                        {
                                pPoly=AcDbPolyline::cast(pEntity);
                                m_PolylineArr.append(pPoly);
                        }
                        else if (pEntity->isKindOf(AcDbText::desc()))
                        {
                                pText=AcDbText::cast(pEntity);
                                m_TextArr.append(pText);
                        }else
                        {
                        }
                }                                
        }               


改成:

for (int i = 0; i <ObiectIds.length(); i++)
        {
                AcDbEntity *pEntity=NULL;
                AcDbPolyline * pPoly=NULL;
                AcDbLine *pLine=NULL;
                AcDbText *pText=NULL;
                Acad::ErrorStatus es=acdbOpenObject(pEntity,ObiectIds,AcDb::kForWrite);
                if (es==Acad::eOk)
                {
                        if (pEntity->isKindOf(AcDbLine::desc()))
                        {
                                pLine=AcDbLine::cast(pEntity);
                                m_LineArr.append(pLine);
                        }else if (pEntity->isKindOf(AcDbPolyline::desc()))
                        {
                                pPoly=AcDbPolyline::cast(pEntity);
                                m_PolylineArr.append(pPoly);
                        }
                        else if (pEntity->isKindOf(AcDbText::desc()))
                        {
                                pText=AcDbText::cast(pEntity);
                                m_TextArr.append(pText);
                        }else
                        {
                        }
                        pEntity->close(); //关闭对象
                }                                
        }               
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-3 12:24:16 | 显示全部楼层
本帖最后由 why1025 于 2017-8-3 12:28 编辑
  1. <div>
  2.    if (pEntity->isKindOf(AcDbLine::desc()))
  3.    {
  4.     pLine=AcDbLine::cast(pEntity);
  5.     m_LineArr.append(pLine);
  6.    }else if (pEntity->isKindOf(AcDbPolyline::desc()))
  7.    {
  8.     pPoly=AcDbPolyline::cast(pEntity);
  9.     m_PolylineArr.append(pPoly);
  10.    }
  11.    else if (pEntity->isKindOf(AcDbText::desc()))
  12.    {
  13.     pText=AcDbText::cast(pEntity);
  14.     m_TextArr.append(pText);
  15.    }else
  16.    {
  17.     pEntity->close(); //关闭对象</div><div>   }
  18. </div>
复制代码

我改成这样了,不行的,放外面直接崩溃
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-8-3 12:31:24 | 显示全部楼层

你别放else里面, 放if外面,你看你自己的代码,你打开了对象写,你不关闭怎么能行。

改完了,还有问题,你就看你代码其他地方,打开对象后,忘记关闭没。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-3 12:32:59 | 显示全部楼层
关闭对象的代码在void CMulEntity::appendToCurrentSpace(),我现在拖动,然后结束拖动,实体移动到新位置,都没问题,就是按esc取消后出了问题
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-8-3 12:34:59 | 显示全部楼层

知道了,你用的实体数组保存这些打开的对象,

那你就在用完这些数组的时候,做个循环关闭这些对象。

不推荐你这么做,用那么多类型的数组保存指针。

你在这个地方,用 AcDbObjectIdArray ,只保存ID。

在用 这些数组的其他地方, 你在就近打开写和关闭。

总之,你的问题,就是打开了对象, 但没关闭造成的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-8-3 12:36:21 | 显示全部楼层

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

使用道具 举报

 楼主| 发表于 2017-8-3 12:38:30 | 显示全部楼层
本帖最后由 why1025 于 2017-8-3 12:39 编辑

void CMulEntityJig::doIt(  )
{  

        m_pEnt = new CMulEntity(m_ObiectIdsArr,m_startPoint, m_width, m_height,m_bisRotated,m_bScale); //这个构造参数不对
        setDispPrompt(_T("\n最终点: "));         
          if (drag() == AcEdJig::kNormal)  
        {                          
                 m_pEnt ->appendToCurrentSpace();        
        }                  
        delete m_pEnt;  
}我猜,按esc以后,应该是delete m_pEnt;  
,但我不知道接下来执行什么了,出啥问题了,但是把这句delete注释掉,也还是这个问题
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-8-3 12:48:47 | 显示全部楼层

你就排查,你打开的这些对象,在任何情况,分之结束后关闭没。

上面我说了,推荐你把要操作的对象ID保存到AcDbObjectIdArray里面,需要处理的地方,打开ID,然后就近关闭对象。不要跨函数使用全局打开的对象指针,C++最容易出错的地方就是指针。

不知道你实体指针数组是定义的全局的不。如果是,你在你的类析构函数里面,判断是否是否已经打开写,如果是,关闭。确保对象类析构时候关闭对象。

另外,如果你用指针,推荐使用smart point. 声明 AcDbEntityPointer, 它会自动的帮你关闭对象。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2017-8-3 13:05:08 | 显示全部楼层

AcDbObject::isWriteEnabled




Adesk::Boolean isWriteEnabled() const;



Description
Returns Adesk::kTrue if the object is currently open AcDb::kForWrite and is not currently sending notification. Otherwise returns Adesk::kFalse.







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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 20:29 , Processed in 0.231463 second(s), 56 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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