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

ADN Club => Revit API => Тема начата: Khasan Mamaev от 08-03-2018, 13:22:36

Название: Autodesk.Revit.Creation.FamilyItemFactory.NewExtrusion
Отправлено: Khasan Mamaev от 08-03-2018, 13:22:36
Пытаюсь создать программным путем элемент выдавливания в семействе типовой модели, код на Питоне в Динамо следующий:

Код - Python [Выбрать]
  1. import clr
  2. clr.AddReference("RevitServices")
  3. import RevitServices
  4. from RevitServices.Persistence import DocumentManager
  5. from RevitServices.Transactions import TransactionManager
  6. from System.Collections.Generic import *
  7. # Import RevitAPI
  8. clr.AddReference("RevitAPI")
  9. import Autodesk
  10. from Autodesk.Revit.DB import *
  11.  
  12. from Autodesk.Revit.Creation.FamilyItemFactory import NewExtrusion
  13.  
  14. clr.AddReference("RevitNodes")
  15. import Revit
  16. clr.ImportExtensions(Revit.Elements)
  17. from Revit.Elements import *
  18. clr.ImportExtensions(Revit.GeometryConversion)
  19.  
  20. doc = DocumentManager.Instance.CurrentDBDocument
  21.  
  22.  
  23. lines = IN[1]
  24.  
  25. rvtLines = [i.ToRevitType() for i in lines]
  26.  
  27. curveArrArray = CurveArrArray()
  28. curveArray1 = CurveArray()
  29. for i in rvtLines:
  30.         curveArray1.Append(i)
  31. curveArrArray.Append(curveArray1)
  32.  
  33. pl = Autodesk.Revit.DB.Plane.CreateByNormalAndOrigin(XYZ(0,0,1), XYZ(0,0,0))
  34.  
  35. TransactionManager.Instance.EnsureInTransaction(doc)
  36.  
  37. sketchPlane = Autodesk.Revit.DB.SketchPlane.Create(doc,pl)
  38. solid1 = NewExtrusion(True, curveArrArray, sketchPlane, 100.0)
  39.  
  40. TransactionManager.Instance.TransactionTaskDone()

Подаю в метод, как и требуется, четыре аргумента, но код не работает и ругается что нужно пять аргументов

(https://s13.postimg.org/lul8v3awz/image.png) (https://postimg.org/image/lul8v3awz/)
Название: Re: Autodesk.Revit.Creation.FamilyItemFactory.NewExtrusion
Отправлено: Александр Ривилис от 11-03-2018, 02:11:16
Подаю в метод, как и требуется, четыре аргумента, но код не работает и ругается что нужно пять аргументов
Пятый (а точнее нулевой) аргумент - это объект, с которым метод должен работать: http://www.revitapidocs.com/2015/425e8577-ba2a-ba19-ac24-069078f97209.htm?section=exampleToggle
Название: Re: Autodesk.Revit.Creation.FamilyItemFactory.NewExtrusion
Отправлено: Khasan Mamaev от 11-03-2018, 09:35:53
никакого пятого(нулевого) колеса не нужно, была ошибка в методе создания в строке 38 должно быть:
Код - Python [Выбрать]
  1. solid1 = doc.FamilyCreate.NewExtrusion(True, curveArrArray, sketchPlane, 100.0)

и все норм работает
Название: Re: Autodesk.Revit.Creation.FamilyItemFactory.NewExtrusion
Отправлено: Александр Пекшев aka Modis от 11-03-2018, 10:05:45
никакого пятого(нулевого) колеса не нужно, была ошибка в методе создания в строке 38 должно быть:
Код - Python [Выбрать]
  1. solid1 = doc.FamilyCreate.NewExtrusion(True, curveArrArray, sketchPlane, 100.0)

и все норм работает
Могу предположить, что проблема была в том, что в самом Dynamo тоже есть методы (ноды) с такими-же названиями и у вас в коде вызывался просто не тот метод, который был нужен
Название: Re: Autodesk.Revit.Creation.FamilyItemFactory.NewExtrusion
Отправлено: Khasan Mamaev от 11-03-2018, 10:11:13
В Dynamo нет метода NewExtrusion, я выше показал свою ошибку.
Название: Re: Autodesk.Revit.Creation.FamilyItemFactory.NewExtrusion
Отправлено: Александр Пекшев aka Modis от 11-03-2018, 10:22:58
В Dynamo нет метода NewExtrusion, я выше показал свою ошибку.
Я, если вы не поняли, свой вывод и сделал опираясь на ваш ответ! Иначе, в чем разница вызова метода как в вопросе и вызова метода, который работает правильно?!
Название: Re: Autodesk.Revit.Creation.FamilyItemFactory.NewExtrusion
Отправлено: Александр Ривилис от 11-03-2018, 13:15:59
никакого пятого(нулевого) колеса не нужно, была ошибка в методе создания в строке 38 должно быть:
Код - Python [Выбрать]
  1. solid1 = doc.FamilyCreate.NewExtrusion(True, curveArrArray, sketchPlane, 100.0)

и все норм работает
1. Ты не понял того, что я написал
2. Ты вызывал метод без указания объекта, над которым этот метод производится. Объект и есть этот дополнительный аргумент. В данном случае этот объект doc.FamilyCreate
Название: Re: Autodesk.Revit.Creation.FamilyItemFactory.NewExtrusion
Отправлено: Александр Пекшев aka Modis от 11-03-2018, 13:49:39
2. Ты вызывал метод без указания объекта, над которым этот метод производится. Объект и есть этот дополнительный аргумент. В данном случае этот объект doc.FamilyCreate
Вы правы, а я какую-то чушь сморозил =) Хотя, моя чушь в некоторых случая верна.
Но у меня вот другой вопрос - если этот метод вызывается для объекта, значит это метод расширения. Почему тогда в справке в сигнатуре метода отсутствует аргумент this ...?
Название: Re: Autodesk.Revit.Creation.FamilyItemFactory.NewExtrusion
Отправлено: Александр Ривилис от 11-03-2018, 14:51:01
если этот метод вызывается для объекта, значит это метод расширения.
Почему ты так решил? Думаю что это обычный метод. Честно говоря мне не понятно почему Python вообще пропустил такое выражение solid1 = NewExtrusion(True, curveArrArray, sketchPlane, 100.0) Возможно это его специфика. Думаю, что C# ругнулся бы на этапе компиляции.
Название: Re: Autodesk.Revit.Creation.FamilyItemFactory.NewExtrusion
Отправлено: Александр Пекшев aka Modis от 11-03-2018, 15:03:18
Почему ты так решил? Думаю что это обычный метод
У меня вот в этом месте провалы в знаниях (( Я не понимаю, как делается метод в одном классе, но вызывается у свойства другого объекта! Т.е. метод NewExtrusion() определен в классе Autodesk.Revit.Creation.FamilyItemFactory, но вызываться должен у Autodesk.Revit.DB.Document.FamilyCreate - что является свойством. Я так понимаю, что это что-то относящееся к фабрикам, про которые у меня знаний ровно ноль
Название: Re: Autodesk.Revit.Creation.FamilyItemFactory.NewExtrusion
Отправлено: Александр Ривилис от 11-03-2018, 15:16:22
Александр Пекшев aka Modis,
Свойство Document.FamilyCreate возвращает объект класса FamilyItemFactory, у которого есть метод NewExtrusion.  Всё предельно просто.