Тема: Создание типа линии с помощью ARX

Как создать такой тип линии ---О---О--- программно?

Re: Создание типа линии с помощью ARX

> Dima
Здесь O - это буква "O"? Если да, то из какого шрифта? Если нет, то типом лининии ты не отделаешься. Придется писать свой custom entity... Но это отдельный разговор.
Самый простой способ создать файл myline.lin, прописать в него нужный тебе тип линии и при помощи AcDbDatabase::loadLineTypeFile() или acdbLoadLineTypeFile() загрузить его. Потом этот файл можно спокойно удалить, если он тебе не нужен - AutoCAD его искать не будет. Можно конечно и посложнее - с формированием AcDbLinetypeTableRecord и записью ее в таблицу типов линий чертежа.

Re: Создание типа линии с помощью ARX

Это я знаю :).
Меня интересует можно ли подобно:
*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 файле, создать программно (кодом)
Мне надо будет динамически создавать типы линий(в зависимости от параметров).

Re: Создание типа линии с помощью ARX

> Dima
1) Можно.
2) Кто тебе мешает динамически создавать файл с типами линий в зависимости от параметров, из него загружать его?
Думаешь приятнее задавать кучу параметров для AcDbLinetypeTableRecord? Это возможно но зачем?

Re: Создание типа линии с помощью ARX

Ладно, дарю! :) Надеюсь, разберешься что к чему:

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 и каким образом программно по номеру формы определить имя формы (и наоборот, по имени формы определить номер формы в файле).

Re: Создание типа линии с помощью ARX

Весьма благодарен!!!