пропадают элементы
Главная › Форумы › Задать вопрос › пропадают элементы
Помечено: Auto dimension for rebars
- В этой теме 7 ответов, 4 участника, последнее обновление 4 года, 5 месяцев назад сделано Xuan Li.
-
АвторСообщения
-
ЮлияУчастник
На мой взгляд, странность))
С помощью динамо расставляю семейства в нужных мне местах, затем меняю немного входные параметры и опять расставляю семейства с помощью скрипта, но почему то ранее созданные элементы пропадают…
подскажите, пожалуйста, что можно сделать
Вот прямо сегодня столкнулся с такой проблемой. Подробней рассказал Лобанов в своих уроках
https://youtu.be/XIGpuP23k9k?list=PLVCDzVIlOckHsZcqkq3DmzdGcq2503l1G&t=1175
Решение: создавать элементы не средствами Динамо, с через питон.
Я использовал команду doc.Create.NewFamilyinstance. Тогда семейства создаются без привязки к Динамо. Если нужно, могу подсказать как работать с NewFamilyinstance.p.s.
import Revit
clr.ImportExtensions(Revit.Elements)Element.ToDSType(False) – если мы создали элемент в Dynamo (и его не было в Revit) – Dynamo будет отслеживать. Т.е. при очередном запуске старый элемент будет удаляться и создаваться новый!
Element.ToDSType(True) – Dynamo не будет отслеживать и при каждом запуске будут создаваться новые элементы, старые удаляться не будут.
ЮлияУчастникСпасибо большое! попробую все способы)
буду рада подсказке про NewFamilyinstance
ЮлияУчастникСпасибо!
Вдогонку.
Вчера тестил свой скрипт. Оказалось, что даже при использовании Element.ToDSType(True) последний элемент сидит в памяти Динамо.
У меня получилась такая последовательность дейтсвий:
1 выполнение скрипта. Устанавливается Семейсвто 1 по координатам 1. Семейство 1 и его координаты закладываются в память.
2 последующие выполнения скрипта.- ставится Семейство из памяти, фактически дублируется. Скрип пересчитывается, устанавливается Семейство 2, семейство 2 записывается в память.Когда я 5 раз запустил скрип, то вместо ожидаемых 5 розеток получил 9 розеток. 4*2 + последняя не продублировавшаяся.
Пришлось вспомнить о перезагрузке скрипта с помощью нода ПроРуБим ForcedChildrensEval. Назначаю в питоне переменную равную значению из ForcedChildrensEval и запускаю установку семейств по этому значению.
С программной точки зрения, когда скриптпытается поставить дубль из памяти, его принудительно обновляет ForcedChildrensEval и поставить дубль не дает. После обновления семейство ставится в штатном режиме.
Код примера на питоне изменил так:
В Динамо выглядит такв процессе редактирования такое возможно..
для этого нужно закрыть скрипт (а еще лучше и динамо) и открыть заново.Xuan LiУчастникHi all
Whwn i run PyS Auto dimension for rebars an error ”
<h1 id=”caas-title” class=”caas__title caas-content-result-mt”>IronPythonEvaluator.EvaluateIronPythonScript operation failed”</h1>
import clr
clr.AddReference(‘RevitAPI’)
import Autodesk
from Autodesk.Revit.DB import *
from System.Collections.Generic import *
import System
import mathclr.AddReference(‘ProtoGeometry’)
from Autodesk.DesignScript.Geometry import *from operator import itemgetter, attrgetter
clr.AddReference(“RevitNodes”)
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
clr.ImportExtensions(Revit.GeometryReferences)clr.AddReference(“RevitServices”)
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManagerdoc = DocumentManager.Instance.CurrentDBDocument
uidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
uiapp=DocumentManager.Instance.CurrentUIApplication
app = uiapp.Applicationgopt = Options()
gopt.ComputeReferences = True
view = doc.ActiveView
gopt.View = viewlist0=[]
for i in IN[0]:
typename = i.GetType().Name
if typename = “x”
list0.append(i)coord=[]
ids=[]
list=[]
elem=list0
listcurve= UnwrapElement(elem[0]).GetCenterlineCurves(0,0,0)
curve= listcurve[0].ToProtoType()
pt0=curve.PointAtParameter(1)
x01 = curve.PointAtParameter(0).X
y01 = curve.PointAtParameter(0).Ylistcurve2= UnwrapElement(elem[1]).GetCenterlineCurves(0,0,0)
curve2= listcurve2[0].ToProtoType()
pt02=curve2.PointAtParameter(1)
x02 = curve2.PointAtParameter(0).X
y02 = curve2.PointAtParameter(0).Yif abs(y01-y02)<10:
for i in list0:
listcurve= UnwrapElement(i).GetCenterlineCurves(0,0,0)
curve= listcurve[0].ToProtoType()
coord.append(curve.PointAtParameter(1).X)
ids.append(UnwrapElement(i).Id)
elif abs(x01-x02)<10:
for i in list0:
listcurve= UnwrapElement(i).GetCenterlineCurves(0,0,0)
curve= listcurve[0].ToProtoType()
coord.append(curve.PointAtParameter(1).Y)
ids.append(UnwrapElement(i).Id)list=zip(coord, ids)
list2=sorted(list, key=itemgetter(0))list3=[]
for i in range(len(list2)):
elemId=list2[i][1]
list3.append(doc.GetElement(elemId).ToDSType(True))elem=list3
listcurve= UnwrapElement(elem[0]).GetCenterlineCurves(0,0,0)
curve= listcurve[0].ToProtoType()
pt0=curve.PointAtParameter(1)
x0 = curve.PointAtParameter(0).X
x1 = curve.PointAtParameter(1).X
y0 = curve.PointAtParameter(0).Y
y1 = curve.PointAtParameter(1).Y
z0 = curve.PointAtParameter(0).Z
z1 = curve.PointAtParameter(1).Z
if abs(y01-y02)<10:
if z0>z1:
pt0= Point.ByCoordinates(x0, y0, z1-300)
pt1= Point.ByCoordinates(pt0.X+100, pt0.Y, pt0.Z)
line=Line.ByStartPointEndPoint(pt0,pt1).ToRevitType()elif z0<z1:
pt0= Point.ByCoordinates(x0, y0, z0-300)
pt1= Point.ByCoordinates(pt0.X+100, pt0.Y, pt0.Z)
line=Line.ByStartPointEndPoint(pt0,pt1).ToRevitType()if y0>y1:
pt0= Point.ByCoordinates(x0, y1-300, 0)
pt1= Point.ByCoordinates(pt0.X+100, pt0.Y, pt0.Z)
line=Line.ByStartPointEndPoint(pt0,pt1).ToRevitType()elif y0<y1:
pt0= Point.ByCoordinates(x0, y0-300, 0)
pt1= Point.ByCoordinates(pt0.X+100, pt0.Y, pt0.Z)
line=Line.ByStartPointEndPoint(pt0,pt1).ToRevitType()elif abs(x01-x02)<10:
if z0>z1:
pt0= Point.ByCoordinates(x0, y0, z1-300)
pt1= Point.ByCoordinates(pt0.X, pt0.Y+100, pt0.Z)
line=Line.ByStartPointEndPoint(pt0,pt1).ToRevitType()elif z0<z1:
pt0= Point.ByCoordinates(x0, y0, z0-300)
pt1= Point.ByCoordinates(pt0.X, pt0.Y+100, pt0.Z)
line=Line.ByStartPointEndPoint(pt0,pt1).ToRevitType()if x0>x1:
pt0= Point.ByCoordinates(x1-300, y1, 0)
pt1= Point.ByCoordinates(pt0.X, pt0.Y+100, pt0.Z)
line=Line.ByStartPointEndPoint(pt0,pt1).ToRevitType()elif x0<x1:
pt0= Point.ByCoordinates(x0-300, y0, 0)
pt1= Point.ByCoordinates(pt0.X, pt0.Y+100, pt0.Z)
line=Line.ByStartPointEndPoint(pt0,pt1).ToRevitType()ref= ReferenceArray()
for i in list3:
rebar=UnwrapElement(i)
geo= rebar.get_Geometry(gopt)
enum = geo.GetEnumerator()
enum.MoveNext()
linerebarref = enum.Current.Reference
ref.Append(linerebarref)TransactionManager.Instance.EnsureInTransaction(doc)
newdim1 = doc.Create.NewDimension(doc.ActiveView, line, ref)
TransactionManager.Instance.TransactionTaskDone()seg=[]
segments = UnwrapElement(newdim1).Segments
for i in segments:
seg.append(i.ValueString)rebarref=[]
for i in list3:
rebar=UnwrapElement(i)
geo = rebar.get_Geometry(gopt)
enum = geo.GetEnumerator()
enum.MoveNext()
linerebarref = enum.Current.Reference
rebarref.append(linerebarref)ref1=ReferenceArray()
rebar=UnwrapElement(elem[0])
geo = rebar.get_Geometry(gopt)
enum = geo.GetEnumerator()
enum.MoveNext()
linerebarref = enum.Current.Reference
ref1.Append(linerebarref)dimseg=[]
k=[]
k.append(0)
dimk=[]
for i in range(len(seg)-1):
if seg[i]==seg[i+1]:
continue
elif seg[i] != seg[i+1]:
rebar=UnwrapElement(elem[i+1])
geo = rebar.get_Geometry(gopt)
enum = geo.GetEnumerator()
enum.MoveNext()
linerebarref = enum.Current.Reference
ref1.Append(linerebarref)
#ref1.Append(rebarref[i+1])
k.append(i+1)
dimseg.append(seg[i])
dimk.append(k)
continuerebar=UnwrapElement(elem[-1])
geo = rebar.get_Geometry(gopt)
enum = geo.GetEnumerator()
enum.MoveNext()
linerebarref = enum.Current.Reference
ref1.Append(linerebarref)dimseg.append(seg[-1])
k.append(len(elem)-1)
p=[]
for i in range(len(k)-1):
p.append(k[i+1]-k[i])TransactionManager.Instance.EnsureInTransaction(doc)
newdim2 = doc.Create.NewDimension(doc.ActiveView, line, ref1)
segments = UnwrapElement(newdim2).Segments
for i in range(len(p)):
if p[i]==1:
segments[i].ValueOverride = dimseg[i]
else:
segments[i].ValueOverride = str(p[i])+ “x” + dimseg[i] + “=” + str(p[i]*int(dimseg[i]))doc.Delete(UnwrapElement(newdim1).Id)
TransactionManager.Instance.TransactionTaskDone()
OUT=newdim2#newdim2.ToDSType(False)
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.