forked from amrit3701/FreeCAD-Reinforcement
-
Notifications
You must be signed in to change notification settings - Fork 0
/
RebarDistribution.py
113 lines (103 loc) · 5.25 KB
/
RebarDistribution.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# -*- coding: utf-8 -*-
# ***************************************************************************
# * *
# * Copyright (c) 2017 - Amritpal Singh <[email protected]> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
__title__ = "DialogDistribution"
__author__ = "Amritpal Singh"
__url__ = "https://www.freecadweb.org"
from PySide import QtCore, QtGui
from Rebarfunc import *
from PySide.QtCore import QT_TRANSLATE_NOOP
import FreeCAD
import FreeCADGui
import ArchCommands
import os
import sys
import math
class _RebarDistributionDialog():
def __init__(self, frontCover, size):
self.FrontCover = frontCover
self.ExpandingLength = size
self.form = FreeCADGui.PySideUic.loadUi(os.path.splitext(__file__)[0] + ".ui")
self.form.setWindowTitle(QtGui.QApplication.translate("Arch", "Rebar Distribution", None))
self.form.image.setPixmap(QtGui.QPixmap(os.path.split(os.path.abspath(__file__))[0] + "/icons/RebarDistribution.svg"))
def accept(self):
amount1 = self.form.amount1.value()
spacing1 = self.form.spacing1.text()
spacing1 = FreeCAD.Units.Quantity(spacing1).Value
amount2 = self.form.amount2.value()
spacing2 = self.form.spacing2.text()
spacing2 = FreeCAD.Units.Quantity(spacing2).Value
amount3 = self.form.amount3.value()
spacing3 = self.form.spacing3.text()
spacing3 = FreeCAD.Units.Quantity(spacing3).Value
self.CustomSpacing = getCustomSpacingString(amount1, spacing1, amount2, spacing2, amount3, spacing3, self.FrontCover, self.ExpandingLength)
def setupUi(self):
# Connect Signals and Slots
self.form.buttonBox.accepted.connect(self.accept)
pass
def getCustomSpacingString(amount1, spacing1, amount2, spacing2, amount3, spacing3, frontCover, size):
seg1_area = amount1 * spacing1 - spacing1 / 2
seg3_area = amount3 * spacing3 - spacing3 / 2
seg2_area = size - seg1_area - seg3_area - 2 * frontCover
if seg2_area < 0:
FreeCAD.Console.PrintError("Sum of length of segment 1 and segment 2 is greater than length of rebar expands.\n")
return
if spacing1 and spacing2 and spacing3 and amount1 and amount2 and amount3:
pass
else:
if spacing1 and spacing2 and spacing3:
amount2 = math.ceil(seg2_area / spacing2)
spacing2 = seg2_area / amount2
elif amount1 and amount2 and amount3:
spacing2 = math.floor(seg2_area / amount2)
CustomSpacing = str(amount1) + "@" + str(spacing1) + "+" + str(int(amount2)) + "@" + str(spacing2) + "+" + str(amount3) + "@" + str(spacing3)
return CustomSpacing
def getupleOfCustomSpacing(span_string):
""" gettupleOfCustomSpacing(span_string): This function take input
in specific syntax and return output in the form of list. For eg.
Input: "3@100+2@200+3@100"
Output: [(3, 100), (2, 200), (3, 100)]"""
import string
span_st = string.strip(span_string)
span_sp = string.split(span_st, '+')
index = 0
spacinglist = []
while index < len(span_sp):
# Find "@" recursively in span_sp array.
in_sp = string.split(span_sp[index], '@')
spacinglist.append((int(in_sp[0]),float(in_sp[1])))
index += 1
return spacinglist
def runRebarDistribution(self):
frontCover = self.form.frontCover.text()
frontCover = FreeCAD.Units.Quantity(frontCover).Value
face = self.SelectedObj.Shape.Faces[getFaceNumber(self.FaceName) - 1]
size = (ArchCommands.projectToVector(self.SelectedObj.Shape.copy(), face.normalAt(0, 0))).Length
dialog = _RebarDistributionDialog(frontCover, size)
dialog.setupUi()
dialog.form.exec_()
self.CustomSpacing = dialog.CustomSpacing
def removeRebarDistribution(self):
self.CustomSpacing = ""
self.Rebar.CustomSpacing = ""
FreeCAD.ActiveDocument.recompute()
#runRebarDistribution(App.ActiveDocument.Rebar)