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

ADN Club => Revit API => Тема начата: Пашин Евгений от 23-11-2015, 15:05:44

Название: Как удалить схему из семейства?
Отправлено: Пашин Евгений от 23-11-2015, 15:05:44
Подскажите как удалить схему из семейства?

Ориентир на Family.DeleteEntity (Schema), но проблема в том, что не могу определить элемент Schema.
Название: Re: Как удалить схему из семейства?
Отправлено: Виктор Чекалин от 23-11-2015, 15:21:10
но проблема в том, что не могу определить элемент Schema
Находите схему по ее ID. Schema.Lookup(Guid)
Название: Re: Как удалить схему из семейства?
Отправлено: Пашин Евгений от 23-11-2015, 15:25:32
Находите схему по ее ID. Schema.Lookup(Guid)
Вроде нашел, но как теперь ее удалить. У нее нет метода Delete или Clear.

Код - vb.net [Выбрать]
  1. Dim sEntity As Entity = myFamily.GetEntity(Schema.Lookup(guid))
Название: Re: Как удалить схему из семейства?
Отправлено: Виктор Чекалин от 23-11-2015, 15:38:12
но как теперь ее удалить
Брр.. так что удалить то надо, схему или удалить сущность схемы у семейства?

Вы же сами написали,
Family.DeleteEntity (Schema)
но не могли найти схему. А я подсказал как ее найти:)
Название: Re: Как удалить схему из семейства?
Отправлено: Пашин Евгений от 23-11-2015, 15:41:31
Брр.. так что удалить то надо, схему или удалить сущность схемы у семейства?

Вот, опять со мной такое... конечно же удалить...

Только вот она не удаляется.
Название: Re: Как удалить схему из семейства?
Отправлено: Виктор Чекалин от 23-11-2015, 15:54:31
что удалить то надо, схему
или удалить сущность схемы у семейства
конечно же удалить...
Вопрос остается в силе. Что удалить?:)
Название: Re: Как удалить схему из семейства?
Отправлено: Пашин Евгений от 24-11-2015, 06:32:01
А в чем разница между схемой и сущностью?

Может, под сущностью Вы подразумеваете ее содержимое? Если так, то мне бы лучше саму схему удалить.
Название: Re: Как удалить схему из семейства?
Отправлено: Виктор Чекалин от 24-11-2015, 08:35:25
Евгений,
проще всего это сравнить с программированием. Схема - это по сути класс, где описываются его название и свойства. А сущность - объект, экземпляр этого класса.

А тут уже зависит от того что вам нужно. Если схема вам больше совсем не нужна, например, создавали ее для тестирования, то имеет смысл ее удалить полностью. Это можно сделать с помощью статического метода Schema.EraseSchemaAndAllEntities. Это удалит из проекта саму схему, а также все сущности этой схемы.

Если есть сущность, привязанная к какому-то объекту, и нужно ее удалить, но сохранив при этом описание схемы в проекте, то Element.DeleteEntity
Название: Re: Как удалить схему из семейства?
Отправлено: Пашин Евгений от 24-11-2015, 08:55:10
Виктор, правильно ли я понимаю?

1. Схема создается строкой 4 (Да/Нет)?:
Код - vb.net [Выбрать]
  1. Dim builder As New SchemaBuilder(guid)
  2. builder.SetSchemaName("Gallurgy")
  3. ...
  4. Dim schema As Schema = builder.Finish

2. Сущностью схемы является (Да/Нет)?:
Код - vb.net [Выбрать]
  1. Dim myEntity As New Entity(schema)

В RevitLookUp, для конкретного семейства, отображается как Entity with Schema [Gallurgy] <Entity>
Вот именно ее мне и надо удалить.
Название: Re: Как удалить схему из семейства?
Отправлено: Виктор Чекалин от 24-11-2015, 09:07:21
1. Да
2. Да

Вот именно ее мне и надо удалить.
Element.DeleteEntity
Название: Re: Как удалить схему из семейства?
Отправлено: Пашин Евгений от 24-11-2015, 09:28:05
Тут и есть загвоздка:
Element.DeleteEntity

Код - vb.net [Выбрать]
  1. myFamily.DeleteEntity (Сюда_Помещается_Схема)

Но как ее определить?

Код - vb.net [Выбрать]
  1. Dim mySchema As Schema = ???

Dim mySchema As Schema = Schema.Lookup(Guid) - не работает!


может какую библиотеку не подключил?
Название: Re: Как удалить схему из семейства?
Отправлено: Виктор Чекалин от 24-11-2015, 09:36:57
Dim mySchema As Schema = Schema.Lookup(Guid) - не работает!
Евгений, я не экстрасенс. Подробней надо объяснить ситуацию. Что именно не работает? Появляется ошибка? Возвращается null? Возвращается верная схема, но при удалении ничего не происходит? При удалении ошибка?
Название: Re: Как удалить схему из семейства?
Отправлено: Пашин Евгений от 24-11-2015, 10:26:30
Подробней надо объяснить ситуацию.

Приношу извинение. Ошибка: «Обращение к локальной переменной schema до ее объявления невозможно.»
Название: Re: Как удалить схему из семейства?
Отправлено: Виктор Чекалин от 24-11-2015, 10:31:25
Евгений, ошибка ведь говорящая:) Ошибка в коде. Попробую угадать, код такой:?
Код - C# [Выбрать]
  1. Dim mySchema As Schema = Schema.Lookup(Guid)
  2. ...
  3. myFamily.DeleteEntity (schema)
  4.  
?
Название: Re: Как удалить схему из семейства?
Отправлено: Пашин Евгений от 24-11-2015, 10:34:56
Dim mySchema As Schema = Schema.Lookup(Guid)

Dim mySchema As Schema = Schema.Lookup(Guid) ругается на schema, подчеркивает синим цветом.

А мой код:

Код - vb.net [Выбрать]
  1.                     Dim mySchema As Schema = schema.Lookup(guid)
  2.  
  3.                     acElFam.DeleteEntity(mySchema)
Название: Re: Как удалить схему из семейства?
Отправлено: Виктор Чекалин от 24-11-2015, 10:36:34
Dim mySchema As Schema = Schema.Lookup(Guid) ругается на schema
schema и Schema  - это разные слова.
Название: Re: Как удалить схему из семейства?
Отправлено: Пашин Евгений от 24-11-2015, 10:47:12
Проблема в том, что к нижнему регистру Visual Studio приводит переменную (schema) сама.

Может это как-то связано с самим Revit. У меня Revit 2015. Других переменных с таким именем нет. Только если в другом методе, в котором эта схема создается. И всё.
Название: Re: Как удалить схему из семейства?
Отправлено: Виктор Чекалин от 24-11-2015, 10:50:29
Visual Studio не приводит сама ничего. Она лишь предлагает подсказки, которыми можно воспользоваться, а можно и не пользоваться.
В данном случае, у вас видимо где то объявлена переменная schema и Visual Studio ее предлагает в подсказках. Но вам же нужна не переменная, а нужно вызвать статический метод EraseSchemaAndAllEntities класса Schema, для этого надо написать название класса, которое начинается с большой буквы.
Название: Re: Как удалить схему из семейства?
Отправлено: Пашин Евгений от 24-11-2015, 10:55:50
Прибить меня мало... внутри метода есть объявленная переменная schema, но она должна будет создавать новую схему после удаления... Изменил ее имя и ошибка перестала беспокоить.

Виктор, приношу извинения. Просто код большой и мой взгляд не смог с первого раза определить эту переменную. Я прошу еще раз прощения.
Название: Re: Как удалить схему из семейства?
Отправлено: Виктор Чекалин от 24-11-2015, 10:58:44
Евгений, просто внимательно читайте ошибки. Они в большинстве случаев содержат достаточно подробное описание, чтобы понять причину.
Название: Re: Как удалить схему из семейства?
Отправлено: Пашин Евгений от 24-11-2015, 11:00:51
Евгений, просто внимательно читайте ошибки. Они в большинстве случаев содержат достаточно подробное описание, чтобы понять причину.
Виктор, Вы неимоверно терпеливы. Огромное Вам спасибо! Все сработало!

Подытожу: получается нельзя сделать защиту семейства от плагиата с помощью Extensible Storage!

Итого:

Код - vb.net [Выбрать]
  1. Private guid As Guid = New Guid("01bc2dbd-561b-4779-3a92-dda4f12bdb6d")
  2. ...
  3.     Public Sub UnMake_It(commandData As ExternalCommandData)
  4.         Dim uiDoc As UIDocument = commandData.Application.ActiveUIDocument
  5.         Dim Doc As Document = uiDoc.Document
  6.         Dim tr As New Transaction(Doc, "Extensible Storage")
  7.         ' Находим все семейства выборкой
  8.         Dim coll As FilteredElementCollector = New FilteredElementCollector(Doc).OfClass(GetType(Autodesk.Revit.DB.Family))
  9.         Dim acElFam As Autodesk.Revit.DB.Element = Nothing
  10.         ' Перебираем все семейства в выборке на предмет поиска созданных семейств
  11.         For Each acEl As Autodesk.Revit.DB.Element In coll
  12.             Dim acEl_IsOwnFamily As Family = CType(acEl, Family)
  13.             Select Case acEl_IsOwnFamily.IsOwnerFamily
  14.                 Case True
  15.                     acElFam = acEl
  16.                     tr.Start()
  17.                     Dim mySchema As Schema = Schema.Lookup(guid)
  18.                     acElFam.DeleteEntity(mySchema)
  19.                     tr.Commit()
  20.                     tr.Dispose()
  21.             End Select
  22.             ' Если созданных семейств не найдено, то выходим из процедуры
  23.             If acElFam Is Nothing Then
  24.                 MsgBox("Удалять нечего!")
  25.                 Exit Sub
  26.             End If
  27.         Next
  28.     End Sub
Название: Re: Как удалить схему из семейства?
Отправлено: Виктор Чекалин от 24-11-2015, 11:06:57
получается нельзя сделать защиту семейства от плагиата с помощью Extensible Storage?
Полноценную - нет. Частичную - можно.