Тема: программное удаление слоя

Помогите, плиз, если кто знает, как удалить слой.
Вот все, что я мог придумать, пользуясь справкой ARX. Но это не работает :(
AcDbLayerTable *pLayerTable;
AcDbLayerTableRecord *pLayerTableRecord;
acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTable, AcDb::kForRead);
pLayerTable->getAt("_TMP_LAY",pLayerTableRecord,AcDb::kForRead,Adesk::kFalse);
pLayerTable->upgradeOpen();
pLayerTable->erased(pLayerTableRecord, Adesk::kTrue);
pLayerTableRecord->close();
pLayerTable->close();

Re: программное удаление слоя

void LayerDeleteLayer(void)
{
  Acad::ErrorStatus es;
  AcDbLayerTableRecordPointer pLTR("_TMP_LAY",acdbCurDwg(),AcDb::kForRead);
  if ((es = pLTR.openStatus()) == Acad::eOk) {
    AcDbObjectIdArray ids; ids.append(pLTR->objectId());
    if (acdbCurDwg()->purge(ids) == Acad::eOk && ids.length() == 1) {
      if ((es = pLTR->upgradeOpen()) == Acad::eOk) {
        if ((es = pLTR->erase()) == Acad::eOk) {
          acutPrintf("\nСлой удален!");
        } else {
          acutPrintf("\npLTR->erase()=%s",acadErrorStatusText(es));
        }
      } else {
        acutPrintf("\npLTR->upgradeOpen()=%s",acadErrorStatusText(es));
      }
    } else {
      acutPrintf("\nСлой удалять нельзя!!! На него есть ссылки или он текущий.");
    }
  } else {
    acutPrintf("\npLTR.openStatus()=%s",acadErrorStatusText(es));
  }
}

Re: программное удаление слоя

Спасибочки. Теперь все работает.

Re: программное удаление слоя

А как удалить слой , с сылками? То есть как найти эти ссылки если графических элементов в слое нет , но он не удаляется.

Re: программное удаление слоя

ну один из вариантов это пробежать по базе чертежа и найти все, что привязано к нужному слою.

Re: программное удаление слоя

А как удалить слой , с сылками? То есть как найти эти ссылки если графических элементов в слое нет , но он не удаляется.

Это может быть, если внутри блоков есть объекты, созданные на этом слое. Ничего страшного. Можно запустить команду _.-LAYDEL, она удалит слой вместе с этими объектами. Запустить можно через SendStringToExecute вместе с опцией [Name], именем слоя и ответом "Y" на вопрос "вы уверены?"

Re: программное удаление слоя

а если Laydel тоже удалить не может? Где ещё можно искать ,что держит слой? По таблице блоков и вставок уже прошлась.

Re: программное удаление слоя

Выложи куда-нибудь такой чертеж.

Re: программное удаление слоя

http://rapidshare.com/files/121134058/draw.dwg.html
defpoints слой с которым не могу справиться :(

Re: программное удаление слоя

> wolka
smile Сразу бы сказала название слоя! Этот слой (как и слой "0") удалять нельзя. Это специфический слой.

Re: программное удаление слоя

а почему?
можно ли его объеденить с 0. Или как от него избавиться. Можно ли программно изменить его свойства?

Re: программное удаление слоя

Просто не обращай на него внимания.

Re: программное удаление слоя

Я бы с удовольствием, но задание не позволяет.
От куда он вообще берётся?

Re: программное удаление слоя

Это специальный слой для команд образмеривания (_DIMXXX). Подробнее смотри в документации по AutoCAD.
P.S.: Если задание не учитывает особенности работы AutoCAD - могу только посочувствовать.

Re: программное удаление слоя

P.S.: Попробуй переименовать слой defpoints в любое другое имя (кроме "0"), а после этого удалить этот слой.

Re: программное удаление слоя

На Defpointse лежат блоки стрелок размерных блоков (отличные от обычной стрелки). Пользуйтесь размерными стилями без засечек с обычными стрелаками, и Defpoints можно будет вычистить Purge

Re: программное удаление слоя

Зигмус пишет:

Пользуйтесь размерными стилями без засечек с обычными стрелаками, и Defpoints можно будет вычистить Purge

Нет. Специально провел эксперимент. После появления слоя defpoints команда _PURGE не удаляет этот слой даже если очистить весь чертеж от всех примитивов, блоков, размеров, размерных стилей и т.д. Но после переименования этого слоя _PURGE прекрасно с ним справляется. Вывод - при попытке удаления слоя AutoCAD проверяет его имя и не дает его удалить.

Re: программное удаление слоя

Провела аналогичный эксперимент, но мне вышло сообщение
layer 11 could not be purged becouse it is being referenced by some object(s) in the drawing.
всё таки Autocad проверяет не только имя.

Re: программное удаление слоя

> wolka
Видимо не все удалила, что имеет отношение к этому слою.

Re: программное удаление слоя

А самое смешное, что такой код прекрасно удаляет слой DEFPOINTS в переданном тобой чертеже (проверял в AutoCAD 2008):

static void DelDefPoints(void)
{
  Acad::ErrorStatus es;
  AcDbLayerTablePointer pLT(acdbCurDwg(),AcDb::kForRead);
  if (pLT.openStatus() == Acad::eOk) {
    AcDbObjectId eId;
    if (pLT->getAt(_T("DEFPOINTS"),eId) == Acad::eOk) {
      AcDbLayerTableRecordPointer pLTR(eId,AcDb::kForWrite);
      if ((es = pLTR.openStatus()) == Acad::eOk) {
        if ((es = pLTR->erase()) == Acad::eOk) {
          acutPrintf(_T("Слой DEFPOINTS удален!"));
        } else {
          acutPrintf(_T("\npLTR->erase()=%s"),acadErrorStatusText(es));
        }
      } else {
        acutPrintf(_T("\npLTR.openStatus()=%s"),acadErrorStatusText(es));
      }
    } else {
      acutPrintf(_T("\nНет слоя DEFPOINTS"));
    }
  }
}

Re: программное удаление слоя

большое спасибо , это помогло и в других случаях.

Re: программное удаление слоя

Нет. Специально провел эксперимент. После появления слоя defpoints команда _PURGE не удаляет этот слой даже если очистить весь чертеж от всех примитивов, блоков, размеров, размерных стилей и т.д. Но после переименования этого слоя _PURGE прекрасно с ним справляется. Вывод — при попытке удаления слоя AutoCAD проверяет его имя и не дает его удалить.

Разумеется. Он нужен еще и размерному стилю. Меняем размерный стиль (стили) на использование стрелочек, делаем PURGE для блоков на этом слое (они анонимные), (в эксперименте ACAD 2007 En PURGE пришлось делать дважды), затем LAYDEL без проблем с ним справился. Однако LayerManager да, не берет его.

Re: программное удаление слоя

Ага, и PURGE не справляется