Python. Перенос значений параметров между семействами

Автор Тема: Python. Перенос значений параметров между семействами  (Прочитано 18372 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
как не знаю !?
не соглашусь так как уже получилось для одного элемента , вот код рабочий:
Либо вы не понимаете, либо я не так объясняю.

Попробую еще раз. В коде у вас один цикл вложен вы другой.
Перебираются все Rebar и в этом же цикле перебираются все детали, причем без каких либо условий.
Это значит, что перебор деталей в цикле перебора Rebar, будет выполнятся столько раз, сколько у вас ребаров и фактически, в значения параметров деталей запишутся те значения, который были для последнего Rebar. А какой будет последний (с каким значениями параметров) - вы не знаете. Может конечно и узнаете, но это может быть любой элемент.

Например, коллекция elems, содержащая Rebar, содержит 3 элемента со следующими значениями ABC:
1) R1 (1, 2, 3)
2) R2 (2, 3, 4)
3) R3 (3, 4, 5)

При первой итерации цикла, в значения параметров деталей запишутся значения 1, 2, 3. При второй - значения параметров тех же самых деталей перезапишутся значениями 2, 3, 4. Ну и при последней итерации опять перезапишутся значениями 3, 4, 5.

Так что что у вас получилось, я не знаю. Может конечно случайно там и оказались правильные значения.

не соглашусь
Можете не соглашаться сколько угодно, но проблема у вас именно в алгоритме, а не в коде.

нет,ни как вообще.
ИМХО, задача не решаема в том виде, в каком вы ее хотите решить. Если они никак не связаны, то вы единственный кто знает, что для Детали П1 нужно записать значения 1, 2, 3, а для Детали П2 нужно записать 2, 3, 4. Модель этого не знает, код этого не знает. То есть вам в любом случае нужно в коде написать какими значениями какие детали зполнять.
Ну так и возьмите сначала все Детали П1 и заполните параметры нужными значениям. Потом возьмите Детали П2 и заполните параметры для них и т.п.
Причем здесь арматура, я не пойму. Ну не нужны они для заполнения значений.

Оффлайн mikoАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 55
  • Карма: 0
rule=FilterStringRule(provider, evaluator, "Деталь П1", True)

когда создаю правило , невозможно задать для строки перечисление сток , хотя бы список создать нереально, все время ошибки сыпятся, например если создать :

list=["Деталь П1","Деталь П2"]
rule=FilterStringRule(provider, evaluator, list, True)

или

rule=FilterStringRule(provider, evaluator, ("Деталь П1","Деталь П2"), True)

как тогда по другому задать несколько строковых правил ?
если задать новое правило:

rule2=FilterStringRule(provider, evaluator, "Деталь П2", True)

оно опять же не работает.....код не выполняется.....но без ошибок

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
все время ошибки сыпятся, например если создать :

list=["Деталь П1","Деталь П2"]
rule=FilterStringRule(provider, evaluator, list, True)

или

rule=FilterStringRule(provider, evaluator, ("Деталь П1","Деталь П2"), True)

У каждого метода есть свой набор параметров. Для конструктора FilterStringRule в файле справке описано, какие параметры может принимать конструктор:
Код - C# [Выбрать]
  1. public FilterStringRule(
  2.         FilterableValueProvider valueProvider,
  3.         FilterStringRuleEvaluator evaluator,
  4.         string ruleString,
  5.         bool caseSensitive
  6. )
  7.  
Наивно полагать, что можно обхитрить компилятор и передать в качестве параметров все что захотите.

как тогда по другому задать несколько строковых правил ?
Создаете несколько строковых фильтров. Затем объединяете их с помощью LogicalOrFilter

Оффлайн mikoАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 55
  • Карма: 0
я вас правильно понял ?
Код - Python [Выбрать]
  1. rule=FilterStringRule(provider, evaluator,"Деталь П1", True)
  2. rule2=FilterStringRule(provider, evaluator,"Деталь П2", True)
  3. paramFilter=ElementParameterFilter(rule)
  4. paramFilter2=ElementParameterFilter(rule2)
  5. rules=LogicalOrFilter(paramFilter,paramFilter2)
  6. filterList=List[ElementFilter]()
  7. filterList.Add(symbolFilter)
  8. filterList.Add(type2Filter)
  9. filterList.Add(rules)
  10. Filter=LogicalAndFilter(filterList)

получилось но не уверен что правильно сделал :/ и у меня еще есть вопрос по логике моей задачки

Оффлайн mikoАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 55
  • Карма: 0
а если значений строковых правил больше 3 то насколько я разобрался так должен выглядеть код ?
Код - Python [Выбрать]
  1. rule=FilterStringRule(provider, evaluator,"Деталь П1", True)
  2. rule2=FilterStringRule(provider, evaluator,"Деталь П2", True)
  3. rule3=FilterStringRule(provider, evaluator,"Деталь П3", True)
  4.  
  5. paramFilter=ElementParameterFilter(rule)
  6. paramFilter2=ElementParameterFilter(rule2)
  7. paramFilter3=ElementParameterFilter(rule3)
  8.  
  9. Rulelist=List[ElementFilter]()
  10. Rulelist.Add(paramFilter)
  11. Rulelist.Add(paramFilter2)
  12. Rulelist.Add(paramFilter3)
  13. rules=LogicalOrFilter(Rulelist)
  14.  
  15. filterList=List[ElementFilter]()
  16. filterList.Add(symbolFilter)
  17. filterList.Add(type2Filter)
  18. """filterList.Add(paramFilter)"""
  19. filterList.Add(rules)
  20.  
  21. Filter=LogicalAndFilter(filterList)
  22.  
  23. details=FilteredElementCollector(doc).WherePasses( Filter ).ToElements()

Для понимания моей задачи , во вложении ведомость для семейства rebar=несущая арматура, я же пытаюсь получить такую же ведомость при помощи семейства detail=элементы узлов, в этом семействе я могу сделать пользовательскую спецификацию с возможностью делать ГОСТовские спецификации. Если есть иной способ буду рад его узнать :)

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
а если значений строковых правил больше 3 то насколько я разобрался так должен выглядеть код ?
Да, выглядит все верно.
я же пытаюсь получить такую же ведомость при помощи семейства detail=элементы узлов
Немного не понял, вы хотите сделать спецификацию несущей арматуры на основании данных, содержащихся в элементах узлов?

Оффлайн mikoАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 55
  • Карма: 0
наоборот, из несущей арматуры перенести в элементы узлов, картинка - это ведомость несущей арматуры ,по ГОСТ она должна выглядеть иначе

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
из несущей арматуры перенести в элементы узлов
Моя позиция по этому поводу остается неизменной. Нужно не переносить значения параметров из арматуры, а просто заполнить значения параметров элементов узлов.

Оффлайн mikoАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 55
  • Карма: 0
просто заполнить значения параметров элементов узлов.
а если этих значений около 1000 ?

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
а если этих значений около 1000 ?
Заполнить 1000 значений.