Тема: Создание типа линии с помощью ARX
Как создать такой тип линии ---О---О--- программно?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Создание типа линии с помощью ARX
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как создать такой тип линии ---О---О--- программно?
> Dima
Здесь O - это буква "O"? Если да, то из какого шрифта? Если нет, то типом лининии ты не отделаешься. Придется писать свой custom entity... Но это отдельный разговор.
Самый простой способ создать файл myline.lin, прописать в него нужный тебе тип линии и при помощи AcDbDatabase::loadLineTypeFile() или acdbLoadLineTypeFile() загрузить его. Потом этот файл можно спокойно удалить, если он тебе не нужен - AutoCAD его искать не будет. Можно конечно и посложнее - с формированием AcDbLinetypeTableRecord и записью ее в таблицу типов линий чертежа.
Это я знаю :).
Меня интересует можно ли подобно:
*MyLine,----O----O----O----O----O----O--
A,6.35,-2.54,[CIRC1,ltypeshp.shx,x=-2.54,s=2.54],-2.54,25.4
как в *.lin файле, создать программно (кодом)
Мне надо будет динамически создавать типы линий(в зависимости от параметров).
> Dima
1) Можно.
2) Кто тебе мешает динамически создавать файл с типами линий в зависимости от параметров, из него загружать его?
Думаешь приятнее задавать кучу параметров для AcDbLinetypeTableRecord? Это возможно но зачем?
Ладно, дарю! :) Надеюсь, разберешься что к чему:
static void CreateMyLineType(void) { Acad::ErrorStatus es; // Сначала найдем или создадим AcDbTextStyleTableRecord для ltypeshp.shx // Этот файл должен быть в путях доступа AutoCAD AcDbTextStyleTablePointer pTT(acdbCurDwg(),AcDb::kForRead); if (pTT.openStatus() == Acad::eOk) { AcDbObjectId ttId; AcDbTextStyleTableIterator *iter = NULL; if ((es = pTT->newIterator(iter)) != Acad::eOk) { acutPrintf("\npTT->newIterator(iter)=%s",acadErrorStatusText(es)); return; } for (iter->start();!iter->done(); iter->step()) { AcDbTextStyleTableRecord *pTTR=NULL; if ((es = iter->getRecord(pTTR,AcDb::kForRead)) != Acad::eOk) { acutPrintf("\niter->getRecord(pTTR,AcDb::kForRead)=%s",acadErrorStatusText(es)); delete iter; return; } const char *fname = NULL; pTTR->fileName(fname); if (!stricmp(fname,"ltypeshp.shx")) { ttId = pTTR->objectId(); pTTR->close(); break; } pTTR->close(); } delete iter; // // Если подходящей записи в таблице стилей нет - создадим ее! // if (ttId.isNull()) { if (pTT->upgradeOpen() != Acad::eOk) { return; } AcDbTextStyleTableRecord *pTTR = new AcDbTextStyleTableRecord(); pTTR->setFileName("ltypeshp.shx"); pTTR->setIsShapeFile(true); if ((es = pTT->add(ttId,pTTR)) != Acad::eOk) { acutPrintf("\npTT->add(ttId,pTTR)=%s",acadErrorStatusText(es)); delete pTTR; return; } pTTR->close(); } pTT->close(); // // Теперь можно заняться типом линии // AcDbLinetypeTablePointer pLT(acdbCurDwg(),AcDb::kForRead); if ((es = pLT.openStatus()) != Acad::eOk) { acutPrintf("\npLT.openStatus()=%s",acadErrorStatusText(es)); return; } AcDbObjectId ltrid; if (pLT->getAt("MY_LINETYPE",ltrid) == Acad::eOk) { acutPrintf("\nТип линии с таким именем уже есть!"); return; } if ((es = pLT->upgradeOpen()) != Acad::eOk) { acutPrintf("\npLT->upgradeOpen()=%s",acadErrorStatusText(es)); return; } // // Типа линии еще не было - создадим его. // AcDbLinetypeTableRecord *pLTR = new AcDbLinetypeTableRecord(); pLTR->setName("MY_LINETYPE"); pLTR->setComments("Программно созданный тип линии"); pLTR->setPatternLength(36.83); pLTR->setNumDashes(4); pLTR->setDashLengthAt(0,6.35); pLTR->setDashLengthAt(1,-2.54); pLTR->setShapeNumberAt(1,133); pLTR->setShapeStyleAt(1,ttId); pLTR->setShapeOffsetAt(1,AcGeVector2d(-2.54,0)); pLTR->setShapeScaleAt(1,2.54); pLTR->setDashLengthAt(2,-2.54); pLTR->setDashLengthAt(3,25.4); if ((es = pLT->add(ltrid,pLTR)) != Acad::eOk) { acutPrintf("\npLT->add(ltrid,pLTR)=%s",acadErrorStatusText(es)); delete pLTR; } pLTR->close(); } }
P.S.: Домашнее задание - определить каким образом я узнал, что CIRC1 соответствует 133-ему символу в файле формы ltypeshp.shx и каким образом программно по номеру формы определить имя формы (и наоборот, по имени формы определить номер формы в файле).
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Создание типа линии с помощью ARX
Форум работает на PunBB, при поддержке Informer Technologies, Inc