Форум НПФ  

Вернуться   Форум НПФ "ТОПОМАТИК" > Программные продукты "Топоматик Robur" на платформе "Robur AP3" > Средства разработки Топоматик Robur > Вопросы и ответы
Ник
Пароль
Регистрация FAQ Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11-29-2021, 10:36
Gontarski Gontarski вне форума
Пользователь
 
Регистрация: Mar 2013
Сообщения: 35
По умолчанию Расчет объёмов на питоне

Добрый день!

На примере канавы, создаю свою конструкцию на питоне.
код вот такой:
Код:
.... def OnCreateConstruction(self): if (self.catchPoint == None): return w2 = self.width /2 nodeIn = CrsNode(self.catchPoint, -w2, 0) nodeOut = CrsNode(self.catchPoint, w2, 0) egContour = self.DesignContext.GetEgContour() if egContour == None: return rayIn = CrsRay.Create(nodeIn, -self.zalIn, 1) rayOut = CrsRay.Create(nodeOut, self.zalOut, 1) nodeEqIn = CrsNode.Create(rayIn, egContour) nodeEqOut = CrsNode.Create(rayOut, egContour) contour = CrsContour() contour.Name = self.ditchContourName contour.Code = 2008 # канава contour.IsRedLinePart = True contour.AddRange([nodeEqIn, nodeIn, self.catchPoint, nodeOut, nodeEqOut]) self.Add(contour) def OnCreateVolumes(self): fillContour = self[self.ditchContourName] volume = CrsVolume(fillContour) volume.Code = 2008 # канава self.Add(volume)


Проблема в том, что вышеуказанный код вычисляет площадь канавы без учёта возможных переломов земли. Не могу понять как это реализовать, помогите пожалуйста.
Ответить с цитированием
  #2  
Старый 12-01-2021, 9:26
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

Добрый день!

В Вашем случае, вам необходимо сначала построить общий контур канавы, без учёта пересечения с землёй, а после вычесть из Вашего контура контур линии земли. Для стандартных операций пересечения двух контуров, таких как разность, объединение и пересечение Вы можете воспользоваться встроенными методами класса CrsSemanticConstruction - Difference, Union, Intersect соответственно. Вам необходимо наследовать Вашу конструкцию от CrsSemanticConstruction. Код будет выглядеть примерно так:
Код:
if (self.catchPoint == None): return w2 = self.width /2 nodeIn = CrsNode(self.catchPoint, -w2, 0) nodeOut = CrsNode(self.catchPoint, w2, 0) egContour = self.DesignContext.GetEgContour() if egContour == None: return rayIn = CrsRay.Create(nodeIn, -self.zalIn, 1) rayOut = CrsRay.Create(nodeOut, self.zalOut, 1) #низ канавы, без учёта линии земли bottom = CrsNode.Create(rayIn, rayOut) ditch_without_eg = CrsContour() # замкнутый контур канавы ditch_without_eg.AddRange([nodeIn, self.catchPoint, nodeOut, bottom, nodeIn]) # выполняем пересечение, параметр firstUp определяет, # куда замыкать незамкнутые контура, при операцииях пересечения # в данном случае линия земли будет замыкаться вниз difference_result = self.Difference(ditch_without_eg, edContour, false) cnt = difference_result.Count if (cnt == 0): # если пересечение не дало результатов - то канава не попала на землю ditch_without_eg.Name = self.ditchContourName ditch_without_eg.Code = 2008 ditch_without_eg.IsRedLinePart = True self.Add(ditch_without_eg) else: # в противном случае Вы получаете один или несколько контуров пересечения # которые необходимо добавить while (cnt > 0): c = contours[cnt - 1] if (c.Count > 0): contour = CrsContour() if (c > 0): contour.Name = self.ditchContourName + '_%d' % (cnt) else: contour.Name = self.ditchContourName contour.IsRedLinePart = True contour.Code = 2008 c_cnt = 0 while (c_cnt < c.Count): node = c[c_cnt] n = CrsNode(node.X, node.Y) contour.Add(n) c_cnt += 1 self.Add(contour) cnt -= 1
Ответить с цитированием
  #3  
Старый 12-01-2021, 11:00
Gontarski Gontarski вне форума
Пользователь
 
Регистрация: Mar 2013
Сообщения: 35
По умолчанию

Добрый день!

Спасибо за развернутый ответ.

Скажите а можно ли как-то производить отладку модулей написанных на питоне?
Ответить с цитированием
  #4  
Старый 12-01-2021, 13:18
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

К сожалению возможности отладки конструкций, написанных на питоне немного ограничены. Мы обычно используем для отладки исключения или логирование в консоль.
Ответить с цитированием
  #5  
Старый 12-02-2021, 8:36
Gontarski Gontarski вне форума
Пользователь
 
Регистрация: Mar 2013
Сообщения: 35
По умолчанию

Может быть тогда возможно разрабатывать аналогичные конструкции на c#?
Ответить с цитированием
  #6  
Старый 12-02-2021, 16:52
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

Добрый день!

Сейчас такой возможности нет, мы постараемся предусмотреть это в следующих версиях. В новых версиях также добавлена возможность проектировать конструкции непосредственно в окне поперечника, не используя языки программирования, такие как python. Возможно это будет даже удобнее, для простых случаев.
Ответить с цитированием
  #7  
Старый 12-10-2021, 11:31
Gontarski Gontarski вне форума
Пользователь
 
Регистрация: Mar 2013
Сообщения: 35
По умолчанию

Добрый день!

Скажите, после использования моей конструкции на питоне в каком-либо проекте Робур, если я хочу передать этот проект другому человеку (на другой компьютер или даже в другую организацию), мне необходимо передатвать ему так-же мой файл(ы) с конструкциями на питоне?
Ответить с цитированием
  #8  
Старый 12-10-2021, 17:35
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

Добрый день!

Да, сейчас это необходимо.
Ответить с цитированием
  #9  
Старый 04-15-2022, 11:48
Gontarski Gontarski вне форума
Пользователь
 
Регистрация: Mar 2013
Сообщения: 35
По умолчанию

Добрый день!

Можно ли посчитать объем между конструкцией и контуром на питоне?
Конструкция у меня задана так:

Код:
@dlr.result(CrsContainer) def getConstruction(self): return self.__construction def setConstruction(self, value): self.__construction = value construction = property(getConstruction, setConstruction, doc="Конструкция? Конструкция&Основные")
Ответить с цитированием
  #10  
Старый 04-15-2022, 13:57
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

Добрый день!

Да, это возможно. У Вашей конструкции на языке python, которая должна быть унаследована от CrsSemanticConstruction или его наследников, есть методы - которые позволяют Вам получить результат пересечения многоугольников. В методе OnCreateVolumes Вы должны для каждого
CrsContour внутри self.__construction вызвать метод Intersect, который вернёт Вам один или несколько контуров пересечения и Вашего контура и контура внутри конструкции. Затем Вам необходимо создать CrsVolume и добавить его в Вашу конструкцию.
Ответить с цитированием
Ответ


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 4:02.

Навигация по основному сайту
Главная Каталог продуктов и услуг Где купить Сопровождение
Вакансии О компании Обзоры Канал на YouTube

vBulletin v3.0.7 , Copyright ©2000-2022, Jelsoft Enterprises Ltd.
Copyright © 2003-2022, НПФ "ТОПОМАТИК".