| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > эффективное имя блока EffectiveName в objectarx C++

эффективное имя блока EffectiveName в objectarx C++

Ответ
Поиск в этой теме
Непрочитано 02.03.2012, 17:37 #1
эффективное имя блока EffectiveName в objectarx C++
alex-63
 
инженер
 
Брест
Регистрация: 15.09.2009
Сообщений: 55

Добрый день.
Подскажите пожалуйста метод доступа к effectiveName динамического блока
в objectarx для C++ .
Смотрю в книгу ... вроде как должен быть где-то в
AcDbBlockTableRecord или AcDbDynBlockReference и не нахожу
куда они его спрятали ???
Просмотров: 4156
 
Непрочитано 02.03.2012, 18:21
#2
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


В .NET для объекта BlockReference проверяешь свойство для BlockTableRecord.IsDynamickBlock,
если true то DynamickBlockTablerecord.Name вернет эффективное имя
если false то просто берешь BlockTablerecord.Name наверно в С++ тож самое
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 03.03.2012, 09:54
#3
alex-63

инженер
 
Регистрация: 15.09.2009
Брест
Сообщений: 55


Спасибо. OK

Код:
[Выделить все]
 static void DynBlk_dinfo(void)
	{		
ads_name  ent;
ads_point sltpt;
int ret;
Acad::ErrorStatus es;
ret=acedEntSel(_T("SelBlk"), ent,sltpt);
if (RTNORM!=ret)
{
  acedAlert(_T("NotSelect"));
  return;
}
AcDbObjectId DynBlkId;
es=acdbGetObjectId(DynBlkId,ent);
if (Acad::eOk!=es)
{
  acedAlert(_T("Failed to get entity's ID!"));
  return;
}
AcDbDynBlockReference dynblkRef(DynBlkId);
//////////////////////blkName////////
AcDbObject* pObj; es = acdbOpenAcDbObject(pObj, DynBlkId  , AcDb::kForRead);
AcDbBlockReference *Reference=AcDbBlockReference::cast(pObj);			
	AcDbObjectId refId=Reference->blockTableRecord();		
	AcDbBlockTableRecord* pBlkTableRec; es=acdbOpenObject(pBlkTableRec,refId,AcDb::kForRead);	  
	if(es != Acad::eOk) {acutPrintf(_T("Block Table Rec Open  Error?????")); return;}

  	 const ACHAR* Name; es = pBlkTableRec->getName(Name); 
	 acutPrintf(_T("Name %s"),Name);
	 pObj->close();
///////end blkname/////////////

////////////////////////////DynBlkName///////
AcDbObjectId  blockRecordId=   dynblkRef.dynamicBlockTableRecord ();
es = acdbOpenAcDbObject(pObj, blockRecordId  , AcDb::kForRead);
if (es != Acad::eOk) {acutPrintf(_T("dynBlock Table Rec Open  Error?????")); return;}    
AcDbBlockTableRecord* blkTblRec = AcDbBlockTableRecord::cast(pObj);   

ACHAR *effectiveName;
es=blkTblRec->getName(effectiveName);
if(es!= Acad::eOk) return;
acutPrintf(_T(" Effective Name %s"),effectiveName);
pObj->close();
///////////
if (!dynblkRef.isDynamicBlock())
{
  acedAlert(_T("It is not dynamic block reference!"));
  return;
}
acutPrintf(_T("\nIt is dynamic block!"));

AcDbDynBlockReferencePropertyArray propArr;
dynblkRef.getBlockProperties(propArr);
acutPrintf(_T("\nThere are %d properities!"),propArr.length());
for (int i=0;i<propArr.length();++i)
{
  AcDbDynBlockReferenceProperty prop1=propArr.at(i);

AcDbEvalVariant evalvar=prop1.value();
CString strEvalType;
CString strEval;
    
acutPrintf(_T("\n\n Restype %d"),evalvar.restype);

switch (evalvar.restype) 
  {	  
case 70:// см. dxfcod (entget) 
   strEvalType=_T("int");   
    strEval.Format(_T("%d"),evalvar.resval.rint);// 
   break;
  case 40 ://
   strEvalType=_T("Double");
   strEval.Format(_T("%g"),evalvar.resval.rreal);
   break;
  case 11  : // 
   strEvalType=_T("Point2d");
   strEval.Format(_T("(%.5f,%.5f,0)"),
    evalvar.resval.rpoint[0],
       evalvar.resval.rpoint[1]);
   break;
  case 1 : // 
   strEvalType=_T("String");
   strEval.Format(_T("%s"),evalvar.resval.rstring);
   break;
  default : // e.t.c
	  strEvalType=_T("unknown");
  
  }   
  acutPrintf(_T("\nproperty : %d"),i+1);
  acutPrintf(_T("\n      Name:%s"),prop1.propertyName().constPtr()); 
  acutPrintf(_T("\n      Description : %s"),prop1.description().constPtr());
  acutPrintf(_T("\n      Value Type= %s"),strEvalType);
  acutPrintf(_T("\n      Value = %s\n"),strEval);  
}
	}

Последний раз редактировалось Кулик Алексей aka kpblc, 03.03.2012 в 12:45.
alex-63 вне форума  
 
Непрочитано 03.03.2012, 12:36
#4
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,408
Отправить сообщение для Александр Ривилис с помощью Skype™


Утечки памяти и незакрытые примитивы - пользуйся интеллектуальными указателями.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 04.03.2012, 22:17
#5
alex-63

инженер
 
Регистрация: 15.09.2009
Брест
Сообщений: 55


Был бы Вам очень благодарен, если бы указали строки с утечкой памяти и незакрытые примитивы.
alex-63 вне форума  
 
Непрочитано 04.03.2012, 22:37
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,408
Отправить сообщение для Александр Ривилис с помощью Skype™


1. Я не буду перечислять все места - их слишком много.
2. В строке 26 при es != Acad::eOk выход и соответственно не закрыт pObj из строки 22.
3. pBlkTableRec из строки 25 не закрывается ни разу...
4. В строке 40 es=blkTblRec->getName(effectiveName); выделяется память под effectiveName но не освобождается.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 05.03.2012, 10:46
#7
alex-63

инженер
 
Регистрация: 15.09.2009
Брест
Сообщений: 55


Спасибо. Английским владею слабо. Пожалуйста, поясните в документации по функции virtual Acad::ErrorStatus getName(ACHAR*& pszName) const;
: ” This function returns a pointer to the name of the table style. pszName points to a dynamically allocated copy of the table style name, and the caller is responsible for freeing the memory used by the returned string using acutDelString(). “ т.е для освобождения памяти необходимо вызвать acutDelString(pszName ). В пример из проекта ARXDBG SAMPLE
Переменной tmpName память не освобождают. Почему? Похоже, что при const TCHAR *tmpName память освобождается C++ автоматически ? И последний вопрос может, укажите ссылку на использование интеллектуальных указателей в проектах objecvtArx (интеллектуальные это std::auto_ptr ?) Заранее благодарен.

Код:
[Выделить все]
 void
AecUiPrEntitySet::getLockedLayers()
{
    m_lockedLayerCache.setLogicalLength(0);
    m_lockedLayerNames.RemoveAll();
    if (m_filterLockedLayers == Adesk::kFalse)
        return;
    AcDbLayerTableRecord* layer;
    const TCHAR* tmpName;
    AcDbLayerTable* layTbl;
    Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()->getSymbolTable(layTbl, AcDb::kForRead);
    if (es == Acad::eOk) {
        AcDbLayerTableIterator* tblIter;
        if (layTbl->newIterator(tblIter) == Acad::eOk) {
            for (; !tblIter->done(); tblIter->step()) {
                es = tblIter->getRecord(layer, AcDb::kForRead);
                if (es == Acad::eOk) {
                    if (layer->isLocked()) {
                        m_lockedLayerCache.append(layer->objectId());
                        es = layer->getName(tmpName);
                        if (es == Acad::eOk) {
                            m_lockedLayerNames.Add(tmpName);
                        }
                        else {
                            AEC_ASSERT(0);
                            m_lockedLayerNames.Add(_DNT(_T("")));   // have to keep balanced
                        }
                    }
                    layer->close();
                }
            }
            delete tblIter;
        }
        else {
            AEC_ASSERT(0);
        }

        layTbl->close();
    }
}

Последний раз редактировалось alex-63, 05.03.2012 в 14:27.
alex-63 вне форума  
 
Непрочитано 05.03.2012, 15:08
#8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,408
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от alex-63 Посмотреть сообщение
Спасибо. Английским владею слабо.
Печально...
Цитата:
Сообщение от alex-63 Посмотреть сообщение
Пожалуйста, поясните в документации по функции virtual Acad::ErrorStatus getName(ACHAR*& pszName) const;
: ” This function returns a pointer to the name of the table style. pszName points to a dynamically allocated copy of the table style name, and the caller is responsible for freeing the memory used by the returned string using acutDelString(). “ т.е для освобождения памяти необходимо вызвать acutDelString(pszName ).
В пример из проекта ARXDBG SAMPLE
Переменной tmpName память не освобождают. Почему?
Ты не обратил внимание, что используется не virtual Acad::ErrorStatus getName(ACHAR*& pszName) const;, а virtual Acad::ErrorStatus getName(const ACHAR*& pszName) const;. А в этом случае освобождать память не нужно.
Цитата:
Сообщение от alex-63 Посмотреть сообщение
И последний вопрос может, укажите ссылку на использование интеллектуальных указателей в проектах objecvtArx (интеллектуальные это std::auto_ptr ?) Заранее благодарен.
Я имел в виду не эти интеллектуальные указатели, а ObjectARX'овские типа AcDbObjectPointer/AcDbEntityPointer и т.д.
Например,
Код:
[Выделить все]
 
static void DynBlk_dinfo(void)
{		
    ads_name  ent;
    ads_point sltpt;
    Acad::ErrorStatus es;
    if (acedEntSel(_T("\nВыберите вставку блока: "), ent,sltpt) != RTNORM) {
        acutPrintf(_T("\nНичего не выбрано!")); return;
    }
    AcDbObjectId idBlkRef;    acdbGetObjectId(idBlkRef,ent);

    AcDbObjectPointer<AcDbBlockReference> pBlkRef(idBlkRef,AcDb::kForRead);
    if ((es = pBlkRef.openStatus()) != Acad::eOk) {
        acutPrintf(_T("\nОшибка открытия BlockReference: %s"), acadErrorStatusText(es)); return;
    }
    AcDbBlockTableRecordPointer pBTR(pBlkRef->blockTableRecord(),AcDb::kForRead);
    if ((es = pBTR.openStatus()) != Acad::eOk) {
        acutPrintf(_T("\nОшибка открытия BlockTableRecord: %s"), acadErrorStatusText(es)); return;
    }
    const ACHAR* sBTRName = NULL; pBTR->getName(sBTRName); 
    if (sBTRName) acutPrintf(_T("Name %s"),sBTRName);

    AcDbDynBlockReference dynblkRef(idBlkRef);
    if (!dynblkRef.isDynamicBlock()) {
        acutPrintf(_T("\nЭто не динамический блок!")); return;
    }
    AcDbBlockTableRecordPointer pDynBTR(dynblkRef.dynamicBlockTableRecord(),AcDb::kForRead);
    if ((es = pDynBTR.openStatus()) != Acad::eOk) {
        acutPrintf(_T("\nОшибка открытия Dyn BlockTableRecord: %s"), acadErrorStatusText(es)); return;
    }
    const ACHAR* sDynBTRName = NULL; pDynBTR->getName(sDynBTRName); 
    if (sDynBTRName) acutPrintf(_T("EffectiveName %s"),sDynBTRName);

    AcDbDynBlockReferencePropertyArray propArr;
    dynblkRef.getBlockProperties(propArr);
    acutPrintf(_T("\nВсего %d свойств!"), propArr.length());
    for (int i=0; i < propArr.length(); ++i)
    {
        AcDbDynBlockReferenceProperty prop = propArr[i];

        AcDbEvalVariant evalvar = prop.value();
        CString strEvalType;
        CString strEval;
        AcDb::DwgDataType dt = acdbGroupCodeToType(evalvar.restype);
        acutPrintf(_T("\n\n Restype=%d DataType=%d"),evalvar.restype, dt);
        
        switch (dt) 
        {	  
        case AcDb::kDwgInt16: 
            strEvalType = _T("short");   
            strEval.Format(_T("%d"),evalvar.resval.rint);
            break;
        case AcDb::kDwgInt32: 
            strEvalType = _T("long");   
            strEval.Format(_T("%ld"),evalvar.resval.rlong);
            break;
        case AcDb::kDwgReal:
            strEvalType = _T("double");
            strEval.Format(_T("%g"),evalvar.resval.rreal);
            break;
        case AcDb::kDwg3Real:
            strEvalType = _T("Point3d");
            strEval.Format(_T("(%.5f,%.5f,%.5f)"),  evalvar.resval.rpoint[0], evalvar.resval.rpoint[1], evalvar.resval.rpoint[2]);
            break;
        case AcDb::kDwgText:
            strEvalType=_T("String");
            strEval.Format(_T("%s"),evalvar.resval.rstring);
            break;
        case AcDb::kDwgHandle:
        case AcDb::kDxfHardOwnershipId:
        case AcDb::kDxfHardPointerId:
        case AcDb::kDxfSoftOwnershipId:
        case AcDb::kDxfSoftPointerId:
            strEvalType=_T("Handle");
            strEval.Format(_T("%08X%08X"),evalvar.resval.rlname[0],evalvar.resval.rlname[1]);
            break;
        default : // e.t.c
            strEvalType=_T("unknown");

        }   
        acutPrintf(_T("\nСвойство: %d"),i+1);
        acutPrintf(_T("\n      Имя: %s"),prop.propertyName().constPtr()); 
        acutPrintf(_T("\n      Описание: %s"),prop.description().constPtr());
        acutPrintf(_T("\n      Тип значения = %s"), LPCTSTR(strEvalType));
        acutPrintf(_T("\n      Значение = %s\n"), LPCTSTR(strEval));  
    }
}
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 05.03.2012, 20:12
#9
alex-63

инженер
 
Регистрация: 15.09.2009
Брест
Сообщений: 55


БОЛЬШОЕ СПАСИБО за мастер класс в objectarx.
Знания в действие ...
alex-63 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > эффективное имя блока EffectiveName в objectarx C++

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить имя блока, открытого в текущий момент в Block editor'е Ax3 Программирование 12 22.06.2014 13:17
Как перенести в чертеж блок из файла библиотеки блоков Main Urod Программирование 8 03.02.2010 14:15
Перевод имени блока в имя переменной и обратно Supermax Программирование 11 14.12.2009 23:26
Имя блока по его вхождению Mischa Программирование 3 14.10.2007 14:57
Вариация моделей в SCAD - проблемы с РСУ UIII SCAD 2 04.10.2007 13:35