Форум НПФ

Форум НПФ "ТОПОМАТИК" (http://www.topomatic.ru/forum/index.php)
-   Вопросы и ответы (http://www.topomatic.ru/forum/forumdisplay.php?f=68)
-   -   Расчет объёмов на питоне (http://www.topomatic.ru/forum/showthread.php?t=8006)

Gontarski 11-29-2021 10:36

Расчет объёмов на питоне
 
Добрый день!

На примере канавы, создаю свою конструкцию на питоне.
код вот такой:
Код:
.... 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)


Проблема в том, что вышеуказанный код вычисляет площадь канавы без учёта возможных переломов земли. Не могу понять как это реализовать, помогите пожалуйста.

Василий Гончаров 12-01-2021 9:26

Добрый день!

В Вашем случае, вам необходимо сначала построить общий контур канавы, без учёта пересечения с землёй, а после вычесть из Вашего контура контур линии земли. Для стандартных операций пересечения двух контуров, таких как разность, объединение и пересечение Вы можете воспользоваться встроенными методами класса 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

Gontarski 12-01-2021 11:00

Добрый день!

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

Скажите а можно ли как-то производить отладку модулей написанных на питоне?

Василий Гончаров 12-01-2021 13:18

К сожалению возможности отладки конструкций, написанных на питоне немного ограничены. Мы обычно используем для отладки исключения или логирование в консоль.

Gontarski 12-02-2021 8:36

Может быть тогда возможно разрабатывать аналогичные конструкции на c#?

Василий Гончаров 12-02-2021 16:52

Добрый день!

Сейчас такой возможности нет, мы постараемся предусмотреть это в следующих версиях. В новых версиях также добавлена возможность проектировать конструкции непосредственно в окне поперечника, не используя языки программирования, такие как python. Возможно это будет даже удобнее, для простых случаев.

Gontarski 12-10-2021 11:31

Добрый день!

Скажите, после использования моей конструкции на питоне в каком-либо проекте Робур, если я хочу передать этот проект другому человеку (на другой компьютер или даже в другую организацию), мне необходимо передатвать ему так-же мой файл(ы) с конструкциями на питоне?

Василий Гончаров 12-10-2021 17:35

Добрый день!

Да, сейчас это необходимо.

Gontarski 04-15-2022 11:48

Добрый день!

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

Код:
@dlr.result(CrsContainer) def getConstruction(self): return self.__construction def setConstruction(self, value): self.__construction = value construction = property(getConstruction, setConstruction, doc="Конструкция? Конструкция&Основные")

Василий Гончаров 04-15-2022 13:57

Добрый день!

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


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

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