редактор блоков. есть ли закрепленная за объектом операция?

Автор Тема: редактор блоков. есть ли закрепленная за объектом операция?  (Прочитано 8974 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
возник такой вопросик. вот я внутри редактора блока выбираю объект. как мне понять, существуют ли какие-то операции, зацепленные на этот конкретный объект (например, перемещение, растяжение, поворот, и т.п.) или это просто, например, нарисованная полилиния без каких либо возможностей её модернизации самим функционалом динамического блока?

и еще, допустим у меня есть блок просто состоящий из круга. открываю его в редакторе блоков. при помощи arxdbg смотрю свойства этого самого круга. xdata нет. просто добавляю точечный параметр, не добавляя никаких операций. сохраняю блок. открываю его заново в редакторе блоков, смотрю свойства круга через arxdbg. у круга появилась xdata ("AcDbBlockRepETag"). удаляю точечный параметр, сохраняю изменения в блоке, переоткрываю его. xdata никуда не уходит. где-то нарыл, что xdata AcDbBlockRepETag на объекте блока говорит о том, что блок у нас динамический (смахивает на бред, но ведь кто-то это написал :):):) ). кстати, xdata появляется на всех объектах блока ТОЛЬКО после сохранения (создаем через редактор блоков новый динамический блок. пока не сохранили изменения и не вышли, xdata на объектах нет).
ну и в связи с этим вопрос. КАК мне понять, нахожусь я внутри стастического блока или динамического (если он был создан ранее а сейчас я просто нахожусь в редакторе блоков внутри этого блока; создаю новый блок с нуля в данный момент в редакторе блоков и уже есть какие-то операции, завязанные на некоторые объекты, либо ничего лишнего в блоке кроме видимых объектов нет)?

для чего всё это нужно. собственно говоря, задача - подчистить содержимое блока от дублей (дважды клацнули точку в одном месте, откопировали кусок содержимого блока со вставкой в той же точке, и т.п.) на любом этапе его создания. так вот, если блок НЕ динамический, никаких проблем нет. а вот если, допустим, есть два отрезка в одинаковых координатах, то перед удалением одного из них мне нужно знать, не завязан ли отрезок на какую-то операцию, а то ведь можно так наудалять, что и вся динамика разлезется :):):)

Отмечено как Решение Николай Горлов 24-02-2015, 16:50:52

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Уж очень у тебя не четкие формулировки. Тем не менее попробуй:
Код - C++ [Выбрать]
  1. static void TestRefs(void)
  2. {
  3.   Acad::ErrorStatus es;
  4.   ads_point p; ads_name en;
  5.   if (acedEntSel(_T("\nВыберите примитив: "),en,p) != RTNORM) return;
  6.   AcDbObjectId idMain; acdbGetObjectId(idMain,en);
  7.   AcDbEntityPointer pEnt(idMain,AcDb::kForRead);
  8.   if (pEnt.openStatus() != Acad::eOk) return;
  9.   ReferenceFiler *rf = new ReferenceFiler();
  10.   rf->setRefId(pEnt->objectId());
  11.   AcDbBlockTableRecordPointer pBTR(pEnt->blockId(),AcDb::kForRead);
  12.   if (pBTR.openStatus() != Acad::eOk) return;
  13.   AcDbObjectId idExtDict = pBTR->extensionDictionary();
  14.   if (idExtDict.isNull()) {
  15.     acutPrintf(_T("\nБлок не динамический."));
  16.     return;
  17.   }
  18.   AcDbDictionaryPointer pExtDict(idExtDict,AcDb::kForRead);
  19.   if (pExtDict.openStatus() != Acad::eOk) return;
  20.   AcDbObjectId idEnh;
  21.   pExtDict->getAt(_T("ACAD_ENHANCEDBLOCK"),idEnh);
  22.   if (idEnh.isNull())   {
  23.     acutPrintf(_T("\nБлок не динамический."));
  24.     return;
  25.   }
  26.   AcDbObjectPointer<AcDbEvalGraph> pGraph(idEnh,AcDb::kForRead);
  27.   if (pGraph.openStatus() != Acad::eOk) return;
  28.   AcDbEvalNodeIdArray idArr;
  29.   if (pGraph->getAllNodes(idArr) != Acad::eOk) return;
  30.   bool isRef = false;
  31.   for (int i = 0; i < idArr.length(); i++)  {
  32.     AcDbEvalNodeId idNode = idArr[i];
  33.     AcDbObject *pObj = NULL;
  34.     pGraph->getNode(idNode,AcDb::kForRead, &pObj);
  35.     if (pObj != NULL && !pObj->isErased()) {
  36.       rf->reset();
  37.       pObj->dwgOut(rf);
  38.       if (rf->hasRefs()) {
  39.         ACHAR str[32]; pObj->id().handle().getIntoAsciiBuffer(str);
  40.         acutPrintf (_T("\nНа этот примитив есть ссылка: "));
  41.         acutPrintf(_T("\n\tClass=%s DxfName=%s Handle=%sH"),
  42.           pObj->id().objectClass()->name(),
  43.           pObj->id().objectClass()->dxfName(),
  44.           str);
  45.         isRef = true;
  46.       }
  47.       pObj->close();
  48.     }
  49.   }
  50.   if (!isRef) {
  51.     acutPrintf(_T("\nНа этот примитив нет ни одной ссылки."));
  52.   }
  53. }

Код - C++ [Выбрать]
  1. // ReferenceFiler.h
  2. /****************************************************************************
  3. **
  4. **      CLASS ReferenceFiler:
  5. **
  6. *************************************/
  7.  
  8. class ReferenceFiler: public AcDbDwgFiler {
  9.  
  10. public:
  11.         ACRX_DECLARE_MEMBERS(ReferenceFiler);
  12.  
  13.         ReferenceFiler(): m_objRefId(AcDbObjectId::kNull) { }
  14.         void setRefId(AcDbObjectId idRef) { m_objRefId = idRef; }
  15.         bool hasRefs() {
  16.                 return m_hardPointerIds.length() > 0 || m_hardOwnershipIds.length() > 0 ||
  17.                         m_softPointerIds.length() > 0 || m_softOwnershipIds.length() > 0;
  18.         }
  19.  
  20.         virtual             ~ReferenceFiler() {}
  21.  
  22.         virtual Acad::ErrorStatus   filerStatus() const { return Acad::eOk; }
  23.         virtual AcDb::FilerType     filerType() const   { return AcDb::kIdFiler; }
  24.         virtual void                setFilerStatus(Acad::ErrorStatus) {}
  25.         virtual void                resetFilerStatus()      {}
  26.  
  27.         virtual Acad::ErrorStatus   readHardOwnershipId(AcDbHardOwnershipId*)
  28.         { return Acad::eOk; }
  29.         virtual Acad::ErrorStatus   writeHardOwnershipId(const AcDbHardOwnershipId&);
  30.  
  31.         virtual Acad::ErrorStatus   readSoftOwnershipId(AcDbSoftOwnershipId*)
  32.         { return Acad::eOk; }
  33.         virtual Acad::ErrorStatus   writeSoftOwnershipId(const AcDbSoftOwnershipId&);
  34.  
  35.         virtual Acad::ErrorStatus   readHardPointerId(AcDbHardPointerId*)
  36.         { return Acad::eOk; }
  37.         virtual Acad::ErrorStatus   writeHardPointerId(const AcDbHardPointerId&);
  38.  
  39.         virtual Acad::ErrorStatus   readSoftPointerId(AcDbSoftPointerId*)
  40.         { return Acad::eOk; }
  41.         virtual Acad::ErrorStatus   writeSoftPointerId(const AcDbSoftPointerId&);
  42.  
  43.         virtual Acad::ErrorStatus   readString(ACHAR **)
  44.         { return Acad::eOk; }
  45.         virtual Acad::ErrorStatus   writeString(const ACHAR *)
  46.         { return Acad::eOk; }
  47.  
  48.         virtual Acad::ErrorStatus   readString(AcString &)
  49.         { return Acad::eOk; }
  50.         virtual Acad::ErrorStatus   writeString(const AcString &)
  51.         { return Acad::eOk; }
  52.  
  53.         virtual Acad::ErrorStatus   readBChunk(ads_binary*)
  54.         { return Acad::eOk; }
  55.         virtual Acad::ErrorStatus   writeBChunk(const ads_binary&)
  56.         { return Acad::eOk; }
  57.  
  58.         virtual Acad::ErrorStatus   readAcDbHandle(AcDbHandle*)
  59.         { return Acad::eOk; }
  60.         virtual Acad::ErrorStatus   writeAcDbHandle(const AcDbHandle&)
  61.         { return Acad::eOk; }
  62.  
  63.         virtual Acad::ErrorStatus   readInt64(Adesk::Int64*)
  64.         { return Acad::eOk; }
  65.         virtual Acad::ErrorStatus   writeInt64(Adesk::Int64)
  66.         { return Acad::eOk; }
  67.  
  68.         virtual Acad::ErrorStatus   readInt32(Adesk::Int32*)
  69.         { return Acad::eOk; }
  70.         virtual Acad::ErrorStatus   writeInt32(Adesk::Int32)
  71.         { return Acad::eOk; }
  72.  
  73.         virtual Acad::ErrorStatus   readInt16(Adesk::Int16*)
  74.         { return Acad::eOk; }
  75.         virtual Acad::ErrorStatus   writeInt16(Adesk::Int16)
  76.         { return Acad::eOk; }
  77.  
  78.         virtual Acad::ErrorStatus   readInt8(Adesk::Int8*)
  79.         { return Acad::eOk; }
  80.         virtual Acad::ErrorStatus   writeInt8(Adesk::Int8)
  81.         { return Acad::eOk; }
  82.  
  83.         virtual Acad::ErrorStatus   readUInt64(Adesk::UInt64*)
  84.         { return Acad::eOk; }
  85.         virtual Acad::ErrorStatus   writeUInt64(Adesk::UInt64)
  86.         { return Acad::eOk; }
  87.  
  88.         virtual Acad::ErrorStatus   readUInt32(Adesk::UInt32*)
  89.         { return Acad::eOk; }
  90.         virtual Acad::ErrorStatus   writeUInt32(Adesk::UInt32)
  91.         { return Acad::eOk; }
  92.  
  93.         virtual Acad::ErrorStatus   readUInt16(Adesk::UInt16*)
  94.         { return Acad::eOk; }
  95.         virtual Acad::ErrorStatus   writeUInt16(Adesk::UInt16)
  96.         { return Acad::eOk; }
  97.  
  98.         virtual Acad::ErrorStatus   readUInt8(Adesk::UInt8*)
  99.         { return Acad::eOk; }
  100.         virtual Acad::ErrorStatus   writeUInt8(Adesk::UInt8)
  101.         { return Acad::eOk; }
  102.  
  103.         virtual Acad::ErrorStatus   readBoolean(Adesk::Boolean*)
  104.         { return Acad::eOk; }
  105.         virtual Acad::ErrorStatus   writeBoolean(Adesk::Boolean)
  106.         { return Acad::eOk; }
  107.  
  108.         virtual Acad::ErrorStatus   readBool(bool*)
  109.         { return Acad::eOk; }
  110.         virtual Acad::ErrorStatus   writeBool(bool)
  111.         { return Acad::eOk; }
  112.  
  113.         virtual Acad::ErrorStatus   readDouble(double*)
  114.         { return Acad::eOk; }
  115.         virtual Acad::ErrorStatus   writeDouble(double)
  116.         { return Acad::eOk; }
  117.  
  118.         virtual Acad::ErrorStatus   readPoint2d(AcGePoint2d*)
  119.         { return Acad::eOk; }
  120.         virtual Acad::ErrorStatus   writePoint2d(const AcGePoint2d&)
  121.         { return Acad::eOk; }
  122.  
  123.         virtual Acad::ErrorStatus   readPoint3d(AcGePoint3d*)
  124.         { return Acad::eOk; }
  125.         virtual Acad::ErrorStatus   writePoint3d(const AcGePoint3d&)
  126.         { return Acad::eOk; }
  127.  
  128.         virtual Acad::ErrorStatus   readVector2d(AcGeVector2d*)
  129.         { return Acad::eOk; }
  130.         virtual Acad::ErrorStatus   writeVector2d(const AcGeVector2d&)
  131.         { return Acad::eOk; }
  132.  
  133.         virtual Acad::ErrorStatus   readVector3d(AcGeVector3d*)
  134.         { return Acad::eOk; }
  135.         virtual Acad::ErrorStatus   writeVector3d(const AcGeVector3d&)
  136.         { return Acad::eOk; }
  137.  
  138.         virtual Acad::ErrorStatus   readScale3d(AcGeScale3d*)
  139.         { return Acad::eOk; }
  140.         virtual Acad::ErrorStatus   writeScale3d(const AcGeScale3d&)
  141.         { return Acad::eOk; }
  142.  
  143.         virtual Acad::ErrorStatus   readBytes(void*, Adesk::UIntPtr)
  144.         { return Acad::eOk; }
  145.         virtual Acad::ErrorStatus   writeBytes(const void*, Adesk::UIntPtr)
  146.         { return Acad::eOk; }
  147.  
  148.         virtual Acad::ErrorStatus   readAddress(void**)
  149.         { return Acad::eOk; }
  150.         virtual Acad::ErrorStatus   writeAddress(const void*)
  151.         { return Acad::eOk; }
  152.  
  153.         virtual Acad::ErrorStatus   seek(Adesk::Int64 nOffset, int nMethod)
  154.         { return Acad::eOk;; }
  155.         virtual Adesk::Int64        tell() const
  156.         { return 0L; }
  157.  
  158.         void            reset();        // set all arrays to empty
  159.  
  160.         // data members
  161.         AcDbObjectId m_objRefId;   // Ссылки "на кого" находим
  162.         AcDbObjectId m_objMainId;  // Кто выводится в Filer
  163.         AcDbObjectIdArray   m_hardPointerIds;  
  164.         AcDbObjectIdArray   m_softPointerIds;  
  165.         AcDbObjectIdArray   m_hardOwnershipIds;  
  166.         AcDbObjectIdArray   m_softOwnershipIds;  
  167. };

Код - C++ [Выбрать]
  1. #include "ReferenceFiler.h"
  2.  
  3. // ReferenceFiler.cpp
  4.  
  5. ACRX_CONS_DEFINE_MEMBERS(ReferenceFiler, AcDbDwgFiler, 0);
  6.  
  7. /****************************************************************************
  8. **
  9. **  ReferenceFiler::writeHardOwnershipId
  10. **
  11. **  **jma
  12. **
  13. *************************************/
  14.  
  15. Acad::ErrorStatus
  16.         ReferenceFiler::writeHardOwnershipId(const AcDbHardOwnershipId& id)
  17. {
  18.         if (id == m_objRefId)
  19.                 m_hardOwnershipIds.append(m_objRefId);
  20.         return Acad::eOk;
  21. }
  22.  
  23. /****************************************************************************
  24. **
  25. **  ReferenceFiler::writeSoftOwnershipId
  26. **
  27. **  **jma
  28. **
  29. *************************************/
  30.  
  31. Acad::ErrorStatus
  32.         ReferenceFiler::writeSoftOwnershipId(const AcDbSoftOwnershipId& id)
  33. {
  34.         if (id == m_objRefId)
  35.                 m_softOwnershipIds.append(m_objRefId);
  36.         return Acad::eOk;
  37. }
  38.  
  39. /****************************************************************************
  40. **
  41. **  ReferenceFiler::writeHardPointerId
  42. **
  43. **  **jma
  44. **
  45. *************************************/
  46.  
  47. Acad::ErrorStatus
  48.         ReferenceFiler::writeHardPointerId(const AcDbHardPointerId& id)
  49. {
  50.         if (id == m_objRefId)
  51.                 m_hardPointerIds.append(m_objRefId);
  52.         return Acad::eOk;
  53. }
  54.  
  55. /****************************************************************************
  56. **
  57. **  ReferenceFiler::writeSoftPointerId
  58. **
  59. **  **jma
  60. **
  61. *************************************/
  62.  
  63. Acad::ErrorStatus
  64.         ReferenceFiler::writeSoftPointerId(const AcDbSoftPointerId& id)
  65. {
  66.         if (id == m_objRefId)
  67.                 m_softPointerIds.append(m_objRefId);
  68.         return Acad::eOk;
  69. }
  70.  
  71. /****************************************************************************
  72. **
  73. **  ReferenceFiler::reset
  74. **
  75. **  **jma
  76. **
  77. *************************************/
  78.  
  79. void
  80.         ReferenceFiler::reset()
  81. {
  82.         m_hardPointerIds.setLogicalLength(0);
  83.         m_softPointerIds.setLogicalLength(0);
  84.         m_hardOwnershipIds.setLogicalLength(0);
  85.         m_softOwnershipIds.setLogicalLength(0);
  86. }
« Последнее редактирование: 24-02-2015, 16:36:04 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
в очередной раз, спасибо за помощь. именно то что нужно.
единственный вариант, когда не срабатывает, это если на объект повесить какую-то операцию, потом удалить операцию, и сразу запустить Вашу проверку "занятости" объекта. Говорит, что занят, до тех пор, пока не сохранить блок в редакторе и переоткрыть его. но с этим сделать ничего нельзя, т.к. все связи обновляются в момент сохранения.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Перепроверь. Я исправлял код. Там появилась дополнительная проверка:
if (pObj != NULL && !pObj->isErased())
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
) а так совсем хорошо. еще раз спасибо