ADN Open CIS
Сообщество программистов Autodesk в СНГ

01/04/2015

Как перезагрузить типы линий из файла

Метод AcDbDatabase::loadLineTypeFile позволяет загрузить типы линий из lin-файла. Если в чертеже имеется одноименный тип линии, то метод loadLineTypeFile вернет код ошибки. Чтобы принудительно перезагрузить типы линий из lin-файла, нужно загрузить их в другую базу, а затем выполнить клонирование в текущую. Вот соответствующий код:

Код - C++: [Выделить]
  1. Acad::ErrorStatus es;
  2.  
  3.  AcDbDatabase *pDb =
  4.      acdbHostApplicationServices()->workingDatabase();
  5.  TCHAR szLtFile[MAX_PATH];
  6.  if  ( RTNORM !=
  7.      acedFindFile(_T("TrimCADLinetypes.LIN"), szLtFile) )
  8.  {
  9.         acutPrintf(ACRX_T("\nlin-файл не найден!"));
  10.         return ;
  11.  }
  12.  
  13.  AcDbLinetypeTable *pLtTable = NULL;
  14.  es = pDb->getLinetypeTable(pLtTable,AcDb::kForRead);
  15.  ACHAR *szLtype = ACRX_T("FLATDOTS");
  16.  bool isLinetypeLoaded = pLtTable->has(szLtype);
  17.  es = pLtTable->close();
  18.  
  19.  if (isLinetypeLoaded)
  20.  {
  21.         // Тип линии уже загружен, попробуем перегрузить его
  22.         AcDbDatabase *pTempDatabase
  23.                      = new  AcDbDatabase(true, false );
  24.         es = pTempDatabase->loadLineTypeFile
  25.                                   (szLtype, szLtFile);
  26.         if (Acad::eOk == es)
  27.         {
  28.                AcDbLinetypeTable *pTempLtTable;
  29.                AcDbLinetypeTableRecord *pTempLtRec=NULL;
  30.  
  31.                es = pTempDatabase->getLinetypeTable(
  32.                                pTempLtTable,AcDb::kForRead);
  33.                AcDbObjectId ltRecId = AcDbObjectId::kNull;
  34.                es = pTempLtTable->getAt(szLtype, ltRecId);
  35.                pTempLtTable->close();
  36.  
  37.                AcDbObjectIdArray objIdArray;
  38.                objIdArray.append(ltRecId);
  39.  
  40.                AcDbIdMapping idMap;
  41.                es = pDb->wblockCloneObjects(
  42.                            objIdArray,
  43.                            pDb->linetypeTableId(),
  44.                      idMap,
  45.                      AcDb::kDrcReplace);
  46.                if (Acad::eOk == es)
  47.                {
  48.                        acutPrintf(
  49.                            ACRX_T("\nТип линии перезагружен!"));
  50.                }
  51.                else
  52.                {
  53.                        acutPrintf(
  54.              ACRX_T("\nИзвините. Не получилось перезагрузить тип линии!"));
  55.                }
  56.         }
  57.         else
  58.         {
  59.                acutPrintf(
  60.          ACRX_T("\nОшибка загрузки типа линии из файла!"));
  61.         }
  62.         delete pTempDatabase;
  63.  }
  64.  else 
  65.  {// Еще не загружен такой тип линии – попробуем его загрузить
  66.         if  ( Acad::eOk ==
  67.             pDb->loadLineTypeFile(szLtype, szLtFile))
  68.         {
  69.                acutPrintf(
  70.                    ACRX_T("\nТип линии загружен из файла!"));
  71.         }
  72.         else
  73.         {
  74.                acutPrintf(
  75.                    ACRX_T("\nОшибка загрузки типа линии из файла!"));
  76.         }
  77.  }

 

Источник: http://adndevblog.typepad.com/autocad/2015/03/reloading-linetype-from-file.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=2604

Опубликовано 01.04.2015