From 05961b1919baaaf6e2f9a80e65d83c812750f350 Mon Sep 17 00:00:00 2001 From: KaratasD Date: Wed, 29 Dec 2021 08:56:56 +0100 Subject: [PATCH 01/13] restored the files --- Examples/TrussGenerator_2D/TrussGenerator.py | 1628 +++++++++++++++++ Examples/TrussGenerator_2D/sources/diag_1.png | Bin 0 -> 2215 bytes Examples/TrussGenerator_2D/sources/diag_2.png | Bin 0 -> 2296 bytes Examples/TrussGenerator_2D/sources/diag_3.png | Bin 0 -> 2687 bytes Examples/TrussGenerator_2D/sources/diag_4.png | Bin 0 -> 2713 bytes Examples/TrussGenerator_2D/sources/diag_5.png | Bin 0 -> 2384 bytes Examples/TrussGenerator_2D/sources/diag_6.png | Bin 0 -> 2420 bytes Examples/TrussGenerator_2D/sources/diag_7.png | Bin 0 -> 2954 bytes .../TrussGenerator_2D/sources/logo_round.png | Bin 0 -> 32882 bytes .../TrussGenerator_2D/sources/truss_1.png | Bin 0 -> 2055 bytes .../TrussGenerator_2D/sources/truss_2.png | Bin 0 -> 2448 bytes .../TrussGenerator_2D/sources/truss_3.png | Bin 0 -> 2454 bytes .../TrussGenerator_2D/sources/truss_4.png | Bin 0 -> 3482 bytes .../TrussGenerator_2D/sources/truss_5.png | Bin 0 -> 4063 bytes RFEM/initModel.py | 2 + 15 files changed, 1630 insertions(+) create mode 100644 Examples/TrussGenerator_2D/TrussGenerator.py create mode 100644 Examples/TrussGenerator_2D/sources/diag_1.png create mode 100644 Examples/TrussGenerator_2D/sources/diag_2.png create mode 100644 Examples/TrussGenerator_2D/sources/diag_3.png create mode 100644 Examples/TrussGenerator_2D/sources/diag_4.png create mode 100644 Examples/TrussGenerator_2D/sources/diag_5.png create mode 100644 Examples/TrussGenerator_2D/sources/diag_6.png create mode 100644 Examples/TrussGenerator_2D/sources/diag_7.png create mode 100644 Examples/TrussGenerator_2D/sources/logo_round.png create mode 100644 Examples/TrussGenerator_2D/sources/truss_1.png create mode 100644 Examples/TrussGenerator_2D/sources/truss_2.png create mode 100644 Examples/TrussGenerator_2D/sources/truss_3.png create mode 100644 Examples/TrussGenerator_2D/sources/truss_4.png create mode 100644 Examples/TrussGenerator_2D/sources/truss_5.png diff --git a/Examples/TrussGenerator_2D/TrussGenerator.py b/Examples/TrussGenerator_2D/TrussGenerator.py new file mode 100644 index 00000000..43e0d810 --- /dev/null +++ b/Examples/TrussGenerator_2D/TrussGenerator.py @@ -0,0 +1,1628 @@ +import sys +import numpy as np +sys.path.append(r'.') +from RFEM.enums import * +from RFEM.window import * +from RFEM.dataTypes import * +from RFEM.initModel import * +from RFEM.BasicObjects.material import * +from RFEM.BasicObjects.section import * +from RFEM.BasicObjects.thickness import * +from RFEM.BasicObjects.node import * +from RFEM.BasicObjects.line import * +from RFEM.BasicObjects.member import * +from RFEM.BasicObjects.surface import * +from RFEM.BasicObjects.solid import * +from RFEM.BasicObjects.opening import * +from RFEM.BasicObjects.lineSet import * +from RFEM.BasicObjects.memberSet import * +from RFEM.BasicObjects.surfaceSet import * +from RFEM.BasicObjects.solidSet import * +from RFEM.TypesForNodes.nodalSupport import * +from RFEM.TypesForMembers.memberHinge import * +from RFEM.LoadCasesAndCombinations.staticAnalysisSettings import * +from RFEM.LoadCasesAndCombinations.loadCase import * +from RFEM.Loads.nodalLoad import * +from RFEM.Loads.memberLoad import * +from RFEM.Loads.surfaceLoad import * + +from PyQt5 import QtCore, QtGui, QtWidgets +import qdarkstyle + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(858, 407) + palette = QtGui.QPalette() + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Light, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Midlight, brush) + brush = QtGui.QBrush(QtGui.QColor(127, 127, 127)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Dark, brush) + brush = QtGui.QBrush(QtGui.QColor(170, 170, 170)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Mid, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.BrightText, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Shadow, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.AlternateBase, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 220)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipBase, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipText, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 128)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Light, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Midlight, brush) + brush = QtGui.QBrush(QtGui.QColor(127, 127, 127)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Dark, brush) + brush = QtGui.QBrush(QtGui.QColor(170, 170, 170)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Mid, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.BrightText, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Shadow, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.AlternateBase, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 220)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipBase, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipText, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 128)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush) + brush = QtGui.QBrush(QtGui.QColor(127, 127, 127)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Light, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Midlight, brush) + brush = QtGui.QBrush(QtGui.QColor(127, 127, 127)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Dark, brush) + brush = QtGui.QBrush(QtGui.QColor(170, 170, 170)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Mid, brush) + brush = QtGui.QBrush(QtGui.QColor(127, 127, 127)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.BrightText, brush) + brush = QtGui.QBrush(QtGui.QColor(127, 127, 127)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Shadow, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.AlternateBase, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 220)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipBase, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipText, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 128)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush) + MainWindow.setPalette(palette) + font = QtGui.QFont() + font.setFamily("Segoe UI") + font.setPointSize(9) + MainWindow.setFont(font) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap("Examples/TrussGenerator_2D/sources/logo_round.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + MainWindow.setWindowIcon(icon) + MainWindow.setWindowOpacity(1.0) + MainWindow.setAutoFillBackground(False) + MainWindow.setStyleSheet("foreground\": \"#eff0f1;\n" +"background\": \"#31363b") + MainWindow.setDocumentMode(False) + self.centralwidget = QtWidgets.QWidget(MainWindow) + self.centralwidget.setObjectName("centralwidget") + self.frame = QtWidgets.QFrame(self.centralwidget) + self.frame.setGeometry(QtCore.QRect(20, 10, 191, 341)) + self.frame.setFrameShape(QtWidgets.QFrame.Box) + self.frame.setFrameShadow(QtWidgets.QFrame.Sunken) + self.frame.setLineWidth(2) + self.frame.setObjectName("frame") + self.verticalLayoutWidget = QtWidgets.QWidget(self.frame) + self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 10, 171, 321)) + self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") + self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) + self.verticalLayout.setContentsMargins(0, 0, 0, 0) + self.verticalLayout.setObjectName("verticalLayout") + self.truss_1 = QtWidgets.QRadioButton(self.verticalLayoutWidget) + self.truss_1.setText("") + icon1 = QtGui.QIcon() + icon1.addPixmap(QtGui.QPixmap("Examples/TrussGenerator_2D/sources/truss_1.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.truss_1.setIcon(icon1) + self.truss_1.setIconSize(QtCore.QSize(150, 32)) + self.truss_1.setObjectName("truss_1") + self.verticalLayout.addWidget(self.truss_1) + self.truss_2 = QtWidgets.QRadioButton(self.verticalLayoutWidget) + self.truss_2.setText("") + icon2 = QtGui.QIcon() + icon2.addPixmap(QtGui.QPixmap("Examples/TrussGenerator_2D/sources/truss_2.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.truss_2.setIcon(icon2) + self.truss_2.setIconSize(QtCore.QSize(150, 32)) + self.truss_2.setObjectName("truss_2") + self.verticalLayout.addWidget(self.truss_2) + self.truss_3 = QtWidgets.QRadioButton(self.verticalLayoutWidget) + self.truss_3.setText("") + icon3 = QtGui.QIcon() + icon3.addPixmap(QtGui.QPixmap("Examples/TrussGenerator_2D/sources/truss_3.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.truss_3.setIcon(icon3) + self.truss_3.setIconSize(QtCore.QSize(150, 32)) + self.truss_3.setObjectName("truss_3") + self.verticalLayout.addWidget(self.truss_3) + self.truss_4 = QtWidgets.QRadioButton(self.verticalLayoutWidget) + self.truss_4.setText("") + icon4 = QtGui.QIcon() + icon4.addPixmap(QtGui.QPixmap("Examples/TrussGenerator_2D/sources/truss_4.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.truss_4.setIcon(icon4) + self.truss_4.setIconSize(QtCore.QSize(250, 40)) + self.truss_4.setObjectName("truss_4") + self.verticalLayout.addWidget(self.truss_4) + self.truss_5 = QtWidgets.QRadioButton(self.verticalLayoutWidget) + self.truss_5.setText("") + icon5 = QtGui.QIcon() + icon5.addPixmap(QtGui.QPixmap("Examples/TrussGenerator_2D/sources/truss_5.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.truss_5.setIcon(icon5) + self.truss_5.setIconSize(QtCore.QSize(250, 50)) + self.truss_5.setObjectName("truss_5") + self.verticalLayout.addWidget(self.truss_5) + self.frame_2 = QtWidgets.QFrame(self.centralwidget) + self.frame_2.setGeometry(QtCore.QRect(220, 10, 631, 131)) + self.frame_2.setFrameShape(QtWidgets.QFrame.Box) + self.frame_2.setFrameShadow(QtWidgets.QFrame.Sunken) + self.frame_2.setLineWidth(2) + self.frame_2.setObjectName("frame_2") + self.gridLayoutWidget = QtWidgets.QWidget(self.frame_2) + self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 611, 108)) + self.gridLayoutWidget.setObjectName("gridLayoutWidget") + self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget) + self.gridLayout.setContentsMargins(0, 0, 0, 0) + self.gridLayout.setObjectName("gridLayout") + self.diag_5 = QtWidgets.QRadioButton(self.gridLayoutWidget) + self.diag_5.setMinimumSize(QtCore.QSize(150, 50)) + self.diag_5.setMaximumSize(QtCore.QSize(130, 50)) + self.diag_5.setText("") + icon6 = QtGui.QIcon() + icon6.addPixmap(QtGui.QPixmap("Examples/TrussGenerator_2D/sources/diag_5.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.diag_5.setIcon(icon6) + self.diag_5.setIconSize(QtCore.QSize(120, 32)) + self.diag_5.setObjectName("diag_5") + self.gridLayout.addWidget(self.diag_5, 0, 2, 1, 1) + self.diag_2 = QtWidgets.QRadioButton(self.gridLayoutWidget) + self.diag_2.setMinimumSize(QtCore.QSize(150, 50)) + self.diag_2.setMaximumSize(QtCore.QSize(130, 50)) + self.diag_2.setText("") + icon7 = QtGui.QIcon() + icon7.addPixmap(QtGui.QPixmap("Examples/TrussGenerator_2D/sources/diag_2.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.diag_2.setIcon(icon7) + self.diag_2.setIconSize(QtCore.QSize(120, 32)) + self.diag_2.setObjectName("diag_2") + self.gridLayout.addWidget(self.diag_2, 1, 0, 1, 1) + self.diag_4 = QtWidgets.QRadioButton(self.gridLayoutWidget) + self.diag_4.setMinimumSize(QtCore.QSize(150, 50)) + self.diag_4.setMaximumSize(QtCore.QSize(130, 50)) + self.diag_4.setText("") + icon8 = QtGui.QIcon() + icon8.addPixmap(QtGui.QPixmap("Examples/TrussGenerator_2D/sources/diag_4.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.diag_4.setIcon(icon8) + self.diag_4.setIconSize(QtCore.QSize(120, 32)) + self.diag_4.setObjectName("diag_4") + self.gridLayout.addWidget(self.diag_4, 1, 1, 1, 1) + self.diag_3 = QtWidgets.QRadioButton(self.gridLayoutWidget) + self.diag_3.setMinimumSize(QtCore.QSize(150, 50)) + self.diag_3.setMaximumSize(QtCore.QSize(130, 50)) + self.diag_3.setText("") + icon9 = QtGui.QIcon() + icon9.addPixmap(QtGui.QPixmap("Examples/TrussGenerator_2D/sources/diag_3.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.diag_3.setIcon(icon9) + self.diag_3.setIconSize(QtCore.QSize(120, 32)) + self.diag_3.setObjectName("diag_3") + self.gridLayout.addWidget(self.diag_3, 0, 1, 1, 1) + self.diag_6 = QtWidgets.QRadioButton(self.gridLayoutWidget) + self.diag_6.setMinimumSize(QtCore.QSize(150, 50)) + self.diag_6.setMaximumSize(QtCore.QSize(130, 50)) + self.diag_6.setText("") + icon10 = QtGui.QIcon() + icon10.addPixmap(QtGui.QPixmap("Examples/TrussGenerator_2D/sources/diag_6.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.diag_6.setIcon(icon10) + self.diag_6.setIconSize(QtCore.QSize(120, 32)) + self.diag_6.setObjectName("diag_6") + self.gridLayout.addWidget(self.diag_6, 1, 2, 1, 1) + self.diag_1 = QtWidgets.QRadioButton(self.gridLayoutWidget) + self.diag_1.setMinimumSize(QtCore.QSize(150, 50)) + self.diag_1.setMaximumSize(QtCore.QSize(130, 50)) + self.diag_1.setText("") + icon11 = QtGui.QIcon() + icon11.addPixmap(QtGui.QPixmap("Examples/TrussGenerator_2D/sources/diag_1.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.diag_1.setIcon(icon11) + self.diag_1.setIconSize(QtCore.QSize(120, 32)) + self.diag_1.setObjectName("diag_1") + self.gridLayout.addWidget(self.diag_1, 0, 0, 1, 1) + self.diag_7 = QtWidgets.QRadioButton(self.gridLayoutWidget) + self.diag_7.setMinimumSize(QtCore.QSize(150, 50)) + self.diag_7.setMaximumSize(QtCore.QSize(130, 50)) + self.diag_7.setText("") + icon12 = QtGui.QIcon() + icon12.addPixmap(QtGui.QPixmap("Examples/TrussGenerator_2D/sources/diag_7.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.diag_7.setIcon(icon12) + self.diag_7.setIconSize(QtCore.QSize(120, 32)) + self.diag_7.setObjectName("diag_7") + self.gridLayout.addWidget(self.diag_7, 0, 3, 1, 1) + self.diag_8 = QtWidgets.QRadioButton(self.gridLayoutWidget) + self.diag_8.setMinimumSize(QtCore.QSize(150, 50)) + self.diag_8.setMaximumSize(QtCore.QSize(130, 50)) + font = QtGui.QFont() + font.setFamily("Verdana") + font.setPointSize(8) + self.diag_8.setFont(font) + self.diag_8.setText("") + self.diag_8.setIconSize(QtCore.QSize(120, 32)) + self.diag_8.setObjectName("diag_8") + self.gridLayout.addWidget(self.diag_8, 1, 3, 1, 1) + self.frame_3 = QtWidgets.QFrame(self.centralwidget) + self.frame_3.setGeometry(QtCore.QRect(220, 150, 281, 201)) + self.frame_3.setFrameShape(QtWidgets.QFrame.Box) + self.frame_3.setFrameShadow(QtWidgets.QFrame.Sunken) + self.frame_3.setLineWidth(2) + self.frame_3.setMidLineWidth(0) + self.frame_3.setObjectName("frame_3") + self.verticalLayoutWidget_2 = QtWidgets.QWidget(self.frame_3) + self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(20, 10, 241, 171)) + self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2") + self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2) + self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.bay_label = QtWidgets.QLabel(self.verticalLayoutWidget_2) + font = QtGui.QFont() + font.setFamily("Verdana") + font.setPointSize(8) + self.bay_label.setFont(font) + self.bay_label.setObjectName("bay_label") + self.horizontalLayout.addWidget(self.bay_label) + self.bay_input = QtWidgets.QSpinBox(self.verticalLayoutWidget_2) + self.bay_input.setObjectName("bay_input") + self.horizontalLayout.addWidget(self.bay_input) + self.verticalLayout_2.addLayout(self.horizontalLayout) + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.length_label = QtWidgets.QLabel(self.verticalLayoutWidget_2) + font = QtGui.QFont() + font.setFamily("Verdana") + self.length_label.setFont(font) + self.length_label.setObjectName("length_label") + self.horizontalLayout_2.addWidget(self.length_label) + self.length_input = QtWidgets.QLineEdit(self.verticalLayoutWidget_2) + self.length_input.setObjectName("length_input") + self.horizontalLayout_2.addWidget(self.length_input) + self.verticalLayout_2.addLayout(self.horizontalLayout_2) + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + self.height_label = QtWidgets.QLabel(self.verticalLayoutWidget_2) + font = QtGui.QFont() + font.setFamily("Verdana") + self.height_label.setFont(font) + self.height_label.setObjectName("height_label") + self.horizontalLayout_3.addWidget(self.height_label) + self.height_input = QtWidgets.QLineEdit(self.verticalLayoutWidget_2) + self.height_input.setObjectName("height_input") + self.horizontalLayout_3.addWidget(self.height_input) + self.verticalLayout_2.addLayout(self.horizontalLayout_3) + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() + self.horizontalLayout_4.setObjectName("horizontalLayout_4") + self.height_label_2 = QtWidgets.QLabel(self.verticalLayoutWidget_2) + font = QtGui.QFont() + font.setFamily("Verdana") + self.height_label_2.setFont(font) + self.height_label_2.setObjectName("height_label_2") + self.horizontalLayout_4.addWidget(self.height_label_2) + self.firstspan_input = QtWidgets.QLineEdit(self.verticalLayoutWidget_2) + self.firstspan_input.setObjectName("firstspan_input") + self.horizontalLayout_4.addWidget(self.firstspan_input) + self.verticalLayout_2.addLayout(self.horizontalLayout_4) + self.horizontalLayout_5 = QtWidgets.QHBoxLayout() + self.horizontalLayout_5.setObjectName("horizontalLayout_5") + self.sideheight_label = QtWidgets.QLabel(self.verticalLayoutWidget_2) + font = QtGui.QFont() + font.setFamily("Verdana") + self.sideheight_label.setFont(font) + self.sideheight_label.setObjectName("sideheight_label") + self.horizontalLayout_5.addWidget(self.sideheight_label) + self.sideheight_input = QtWidgets.QLineEdit(self.verticalLayoutWidget_2) + self.sideheight_input.setObjectName("sideheight_input") + self.horizontalLayout_5.addWidget(self.sideheight_input) + self.verticalLayout_2.addLayout(self.horizontalLayout_5) + self.frame_4 = QtWidgets.QFrame(self.centralwidget) + self.frame_4.setGeometry(QtCore.QRect(520, 150, 331, 201)) + self.frame_4.setFrameShape(QtWidgets.QFrame.Box) + self.frame_4.setFrameShadow(QtWidgets.QFrame.Sunken) + self.frame_4.setLineWidth(2) + self.frame_4.setObjectName("frame_4") + self.gridLayoutWidget_2 = QtWidgets.QWidget(self.frame_4) + self.gridLayoutWidget_2.setGeometry(QtCore.QRect(20, 10, 291, 173)) + self.gridLayoutWidget_2.setObjectName("gridLayoutWidget_2") + self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget_2) + self.gridLayout_2.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint) + self.gridLayout_2.setContentsMargins(0, 0, 0, 0) + self.gridLayout_2.setObjectName("gridLayout_2") + self.line_12 = QtWidgets.QFrame(self.gridLayoutWidget_2) + self.line_12.setFrameShape(QtWidgets.QFrame.VLine) + self.line_12.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_12.setObjectName("line_12") + self.gridLayout_2.addWidget(self.line_12, 6, 1, 1, 1) + self.upperchord_label = QtWidgets.QLabel(self.gridLayoutWidget_2) + font = QtGui.QFont() + font.setFamily("Verdana") + self.upperchord_label.setFont(font) + self.upperchord_label.setObjectName("upperchord_label") + self.gridLayout_2.addWidget(self.upperchord_label, 6, 0, 1, 1) + self.verticals_mat = QtWidgets.QLineEdit(self.gridLayoutWidget_2) + self.verticals_mat.setObjectName("verticals_mat") + self.gridLayout_2.addWidget(self.verticals_mat, 10, 4, 1, 1) + self.diagonals_mat = QtWidgets.QLineEdit(self.gridLayoutWidget_2) + self.diagonals_mat.setObjectName("diagonals_mat") + self.gridLayout_2.addWidget(self.diagonals_mat, 8, 4, 1, 1) + self.verticals_label = QtWidgets.QLabel(self.gridLayoutWidget_2) + font = QtGui.QFont() + font.setFamily("Verdana") + self.verticals_label.setFont(font) + self.verticals_label.setObjectName("verticals_label") + self.gridLayout_2.addWidget(self.verticals_label, 10, 0, 1, 1) + self.lowerchord_label = QtWidgets.QLabel(self.gridLayoutWidget_2) + font = QtGui.QFont() + font.setFamily("Verdana") + self.lowerchord_label.setFont(font) + self.lowerchord_label.setObjectName("lowerchord_label") + self.gridLayout_2.addWidget(self.lowerchord_label, 4, 0, 1, 1) + self.line_7 = QtWidgets.QFrame(self.gridLayoutWidget_2) + self.line_7.setFrameShape(QtWidgets.QFrame.VLine) + self.line_7.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_7.setObjectName("line_7") + self.gridLayout_2.addWidget(self.line_7, 4, 3, 1, 1) + self.line_8 = QtWidgets.QFrame(self.gridLayoutWidget_2) + self.line_8.setFrameShape(QtWidgets.QFrame.VLine) + self.line_8.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_8.setObjectName("line_8") + self.gridLayout_2.addWidget(self.line_8, 6, 3, 1, 1) + self.upperchord_section = QtWidgets.QLineEdit(self.gridLayoutWidget_2) + self.upperchord_section.setObjectName("upperchord_section") + self.gridLayout_2.addWidget(self.upperchord_section, 6, 2, 1, 1) + self.line_6 = QtWidgets.QFrame(self.gridLayoutWidget_2) + self.line_6.setFrameShape(QtWidgets.QFrame.HLine) + self.line_6.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_6.setObjectName("line_6") + self.gridLayout_2.addWidget(self.line_6, 0, 0, 1, 5) + self.line_10 = QtWidgets.QFrame(self.gridLayoutWidget_2) + self.line_10.setFrameShape(QtWidgets.QFrame.VLine) + self.line_10.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_10.setObjectName("line_10") + self.gridLayout_2.addWidget(self.line_10, 10, 3, 1, 1) + self.diagonals_section = QtWidgets.QLineEdit(self.gridLayoutWidget_2) + self.diagonals_section.setObjectName("diagonals_section") + self.gridLayout_2.addWidget(self.diagonals_section, 8, 2, 1, 1) + self.line_4 = QtWidgets.QFrame(self.gridLayoutWidget_2) + self.line_4.setFrameShape(QtWidgets.QFrame.HLine) + self.line_4.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_4.setObjectName("line_4") + self.gridLayout_2.addWidget(self.line_4, 9, 0, 1, 5) + self.label_5 = QtWidgets.QLabel(self.gridLayoutWidget_2) + font = QtGui.QFont() + font.setFamily("Verdana") + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.label_5.setFont(font) + self.label_5.setObjectName("label_5") + self.gridLayout_2.addWidget(self.label_5, 1, 2, 1, 1) + self.line = QtWidgets.QFrame(self.gridLayoutWidget_2) + self.line.setFrameShape(QtWidgets.QFrame.HLine) + self.line.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line.setObjectName("line") + self.gridLayout_2.addWidget(self.line, 2, 0, 1, 5) + self.label_7 = QtWidgets.QLabel(self.gridLayoutWidget_2) + font = QtGui.QFont() + font.setFamily("Verdana") + font.setPointSize(8) + font.setBold(False) + font.setWeight(50) + self.label_7.setFont(font) + self.label_7.setObjectName("label_7") + self.gridLayout_2.addWidget(self.label_7, 1, 4, 1, 1) + self.lowerchord_section = QtWidgets.QLineEdit(self.gridLayoutWidget_2) + self.lowerchord_section.setObjectName("lowerchord_section") + self.gridLayout_2.addWidget(self.lowerchord_section, 4, 2, 1, 1) + self.line_2 = QtWidgets.QFrame(self.gridLayoutWidget_2) + self.line_2.setFrameShape(QtWidgets.QFrame.HLine) + self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_2.setObjectName("line_2") + self.gridLayout_2.addWidget(self.line_2, 5, 0, 1, 5) + self.line_14 = QtWidgets.QFrame(self.gridLayoutWidget_2) + self.line_14.setFrameShape(QtWidgets.QFrame.VLine) + self.line_14.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_14.setObjectName("line_14") + self.gridLayout_2.addWidget(self.line_14, 10, 1, 1, 1) + self.line_11 = QtWidgets.QFrame(self.gridLayoutWidget_2) + self.line_11.setFrameShape(QtWidgets.QFrame.VLine) + self.line_11.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_11.setObjectName("line_11") + self.gridLayout_2.addWidget(self.line_11, 1, 3, 1, 1) + self.line_15 = QtWidgets.QFrame(self.gridLayoutWidget_2) + self.line_15.setFrameShape(QtWidgets.QFrame.VLine) + self.line_15.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_15.setObjectName("line_15") + self.gridLayout_2.addWidget(self.line_15, 4, 1, 1, 1) + self.line_9 = QtWidgets.QFrame(self.gridLayoutWidget_2) + self.line_9.setFrameShape(QtWidgets.QFrame.VLine) + self.line_9.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_9.setObjectName("line_9") + self.gridLayout_2.addWidget(self.line_9, 8, 3, 1, 1) + self.line_3 = QtWidgets.QFrame(self.gridLayoutWidget_2) + self.line_3.setFrameShape(QtWidgets.QFrame.HLine) + self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_3.setObjectName("line_3") + self.gridLayout_2.addWidget(self.line_3, 7, 0, 1, 5) + self.line_16 = QtWidgets.QFrame(self.gridLayoutWidget_2) + self.line_16.setFrameShape(QtWidgets.QFrame.VLine) + self.line_16.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_16.setObjectName("line_16") + self.gridLayout_2.addWidget(self.line_16, 1, 1, 1, 1) + self.diagonals_label = QtWidgets.QLabel(self.gridLayoutWidget_2) + font = QtGui.QFont() + font.setFamily("Verdana") + self.diagonals_label.setFont(font) + self.diagonals_label.setObjectName("diagonals_label") + self.gridLayout_2.addWidget(self.diagonals_label, 8, 0, 1, 1) + self.verticals_section = QtWidgets.QLineEdit(self.gridLayoutWidget_2) + self.verticals_section.setObjectName("verticals_section") + self.gridLayout_2.addWidget(self.verticals_section, 10, 2, 1, 1) + self.lowerchord_mat = QtWidgets.QLineEdit(self.gridLayoutWidget_2) + self.lowerchord_mat.setObjectName("lowerchord_mat") + self.gridLayout_2.addWidget(self.lowerchord_mat, 4, 4, 1, 1) + self.upperchord_mat = QtWidgets.QLineEdit(self.gridLayoutWidget_2) + self.upperchord_mat.setObjectName("upperchord_mat") + self.gridLayout_2.addWidget(self.upperchord_mat, 6, 4, 1, 1) + self.line_5 = QtWidgets.QFrame(self.gridLayoutWidget_2) + self.line_5.setFrameShape(QtWidgets.QFrame.HLine) + self.line_5.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_5.setObjectName("line_5") + self.gridLayout_2.addWidget(self.line_5, 11, 0, 1, 5) + self.line_13 = QtWidgets.QFrame(self.gridLayoutWidget_2) + self.line_13.setFrameShape(QtWidgets.QFrame.VLine) + self.line_13.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_13.setObjectName("line_13") + self.gridLayout_2.addWidget(self.line_13, 8, 1, 1, 1) + self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget) + self.horizontalLayoutWidget.setGeometry(QtCore.QRect(690, 360, 160, 25)) + self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget") + self.horizontalLayout_10 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget) + self.horizontalLayout_10.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout_10.setObjectName("horizontalLayout_10") + self.create_button = QtWidgets.QPushButton(self.horizontalLayoutWidget) + self.create_button.setObjectName("create_button") + self.horizontalLayout_10.addWidget(self.create_button) + self.done_button = QtWidgets.QPushButton(self.horizontalLayoutWidget) + self.done_button.setObjectName("done_button") + self.horizontalLayout_10.addWidget(self.done_button) + MainWindow.setCentralWidget(self.centralwidget) + self.statusbar = QtWidgets.QStatusBar(MainWindow) + self.statusbar.setObjectName("statusbar") + MainWindow.setStatusBar(self.statusbar) + + self.create_button.clicked.connect(self.click) + self.done_button.clicked.connect(self.close) + + self.retranslateUi(MainWindow) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "2D Truss Generator")) + self.bay_label.setText(_translate("MainWindow", "Number of Bays: ")) + self.length_label.setText(_translate("MainWindow", "Total Length (m): ")) + self.height_label.setText(_translate("MainWindow", "Total Height (m): ")) + self.height_label_2.setText(_translate("MainWindow", "First Span (m): ")) + self.sideheight_label.setText(_translate("MainWindow", "Side Height (m): ")) + self.upperchord_label.setText(_translate("MainWindow", "Upper Chord")) + self.verticals_label.setText(_translate("MainWindow", "Verticals ")) + self.lowerchord_label.setText(_translate("MainWindow", "Lower Chord")) + self.label_5.setText(_translate("MainWindow", " Cross Section")) + self.label_7.setText(_translate("MainWindow", " Material")) + self.diagonals_label.setText(_translate("MainWindow", "Diagonals ")) + self.create_button.setText(_translate("MainWindow", "Create Model")) + self.done_button.setText(_translate("MainWindow", "Done")) + + def click(self): + + if self.truss_1.isChecked(): + + upper_chord_material = self.upperchord_mat.text() + lower_chord_material = self.lowerchord_mat.text() + diagonal_material = self.diagonals_mat.text() + vertical_material = self.verticals_mat.text() + + upper_chord_section = self.upperchord_section.text() + lower_chord_section = self.lowerchord_section.text() + diagonal_section = self.diagonals_section.text() + vertical_section = self.verticals_section.text() + + number_of_bays = int(self.bay_input.text()) + total_length = float(self.length_input.text()) + total_height = float(self.height_input.text()) + first_span = float(self.firstspan_input.text()) + side_height = float(self.sideheight_input.text()) + + model_list = client.service.get_model_list() + if len(model_list) == 0: + Model(True, "MyTruss", reset=True) + + elif len(model_list) == 1: + name = model_list[0] + Model(False, name, reset=True) + + Model.clientModel.service.begin_modification() + + # Create Materials + Material(1, upper_chord_material) + Material(2, lower_chord_material) + Material(3, diagonal_material) + Material(4, vertical_material) + + # Create Sections + Section(1, upper_chord_section, 1) + Section(2, lower_chord_section, 2) + Section(3, diagonal_section, 3) + Section(4, vertical_section, 4) + + # Create Nodes + x_nodes = np.repeat(np.arange(0, total_length + total_length/number_of_bays, total_length/number_of_bays), 2) + z_nodes = (0, (-total_height))*int((len(x_nodes)/2)) + tag_nodes = np.arange(1, len(x_nodes)+1, 1) + + for tag,x,z in zip(tag_nodes, x_nodes, z_nodes): + Node(tag, x, 0, z) + + # Create Lower Chord + Member(1, 1, tag_nodes[-2], 0, 2, 2) + + # Create Upper Chord + Member(2, 2, tag_nodes[-1], 0, 1, 1) + + # Create Verticals + i = 1 + j = 1 + while jGG>7>5=N#w{)s3YdqXGnkgtPBDf|XbqvJFoq^}umd(Wq}Pac@|wl+70?^7(vcI9%W%onFQnh!zA17C>M<5b}`aB;m<$_z)jn z3G-L-1vm`n3uKT83?jGy5=$HzzSBztUkQo|ARw^BN(MclL==P=4h9$kumAxOSP%;{ zAtx3t1&AyhrU@(I(ve_yR3wlT2*dzhqEq7reLi0fVw&_5;GrVi{?J5<+{c6h06`1I z1yF%dEEX2P@Wj4mXStIhzb7+M4Z%9SnMy>yNGho>p$uwWsXtPTSxMD|34jwPm?#+v zW@zw)svxt#Cc{Jq^$>B=4L0TH3zWdjSFV9v@|8~|R;5lLh08EVAJ&Ob%w(jM8Ihn9 zoc5*PMqt%SI3pr)P$A z5k{$nZz>JNtt!40n2TuCpw@ue075fV&bMnxPdrH{%~~n#aBCDs3YJI>N`*|vFCiQ* zdDx_p*=UbEM3HP*C$o6sDIHVnbFqZHRBem8Scge2g|Ko;WhSB!CBSsLQlrr-;4FG5 z#ECQsze}zswIow46v0l~B9m}oR3x}uVLdJ9k}9cGp;QSuK20eo z%tRDM^lBPKL}EXcfb7LSKdrTeKu*GKpj83ZFLHSZ34@5^7?F%w#Zsv|W|TMu;X=SM z3LsD_XdnbM2~sFAXh8WWF5+O=JMq3P#U_I~LKLP53k{|bgCiR$I&6PHh>GPdJLD#?JAiP@jIOn4IcJ8ln#$h z;xSWhkcozL`eHUE_n8baQ_Sj4$*e@c&U%Gz4UI~%Bp$PnA~)a}5DO`E8z?lQod78; zC9}9=YK4|_$=!a5-;R+Cpaq0+OCn^^>**96v{JFS&%oLgl;2L{#Ys!bAh4B_zLJ>D zrl%ssfDalP6{q4DYlH-)0XPn(DeyzMlysuO1>m-#|GOD4uL+pH`s@glKTC`);PEDZ zs!_;rZtYhMGNuQbrTq7iy?NPF|5>Sg;_1{(UF@7Owt}hMHu>IseE0FCi=R|`bkBa- z%e=RLon?p4)4dP(lTS~j zA2y7Q_P==Q?oH^@v1dB3xb^3`q(a1^0>|QjlZVKtBLsvJSqsITz z_g1RuG$;D3U17+|+k9bQzkguo+Ro7?!5-_yP`YAsHUPf^;IAwI{ATO(+DZHV+7an& zXqQ*Qr~0MuJ}VtQ1XtybJ2tFgY|z3P-6xjS#F@yAk=a+4vOBI0Y+Hx#xw$Q1y?#gh z+mp+`%x=HA>-N`|wg}bN+l05K9kuptMo+!j{$b@Y{CZAXSoECq+|6$PD{Y|2(&ucFA8+J=w3KEbgcyoNnViz<9?`iENHs6Gjf#IGOhYk73DoR@A`{!aD# zH(c2jgMHZ8NN)4;oN9GVk9xzoo-^hx?YZ~1zMf}{Ua9k9IfWyaTE``0bElz5$&U>q zmugoBK1keRpoJn+-pQ5C=0$I$pPx9eE{nQ4b#2)Xibjs%bit1QtW!`2P->6qihj|H zqvosA(N8+6-|6<%f0)IAHuUdWi4x5%#&OY34d@u)O>kghjcsz6Z-hDmh zD4R~L?u^V-0uDR z?CNm;s`bd-T{XcKRd>#eb`~`}eK4=~qw?dMD!3+9`h)tLjiVQ5R*Yty&^~&BH3o-t l?+Sm2%XyP#`D!l~y*GJQ-_@b4?ckpWPou;XN0D_K{|lCpcH;m5 literal 0 HcmV?d00001 diff --git a/Examples/TrussGenerator_2D/sources/diag_2.png b/Examples/TrussGenerator_2D/sources/diag_2.png new file mode 100644 index 0000000000000000000000000000000000000000..97f58061bb4e68b9acadb6fb9b7232e5e722ae1b GIT binary patch literal 2296 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 jJ63I;x$1o6%zD)BD)G;lz|jZ~yAQ;)s*H literal 0 HcmV?d00001 diff --git a/Examples/TrussGenerator_2D/sources/diag_4.png b/Examples/TrussGenerator_2D/sources/diag_4.png new file mode 100644 index 0000000000000000000000000000000000000000..739ed738c94441fe689378b4567d5d29ad9fbdc0 GIT binary patch literal 2713 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 literal 0 HcmV?d00001 diff --git a/Examples/TrussGenerator_2D/sources/diag_6.png b/Examples/TrussGenerator_2D/sources/diag_6.png new file mode 100644 index 0000000000000000000000000000000000000000..68b54f96c173d17d390eae8175fcb035b616a0c4 GIT binary patch literal 2420 zcmYjTc~nzZ8jmei#7doNm7>@lDT?+O^YXH(tu}ke@)ELQkV5jZz3hv_5DCCA3rIjgql}0_8f7*>m~OY- zs4?nA81T-c!gL}`18}lPpp=M{$ZR0nF`E%=d?RXeMXsAdy*l$qCel=+&Z)teYO|2!^h10#j8aB2@EdbHn9Dh021Qum5rsG8 zHjbbMqaQR8*>mWU<^P$PKre9lchlnB`!v@ zy$TOGq;jJ+8CfdR$Ye6EnZq&D@Bn1sfg-XTN-dj-QpF;U8E4ShOf|rk2x)dy6yVBP zI<<{$m5My}9E(x~Je%ceLv~Py26Qx7#r3!m1c2nA%Ic7+6f`%)w^PNSBRsKChY4V{ zm>V<;X%tN4(E|dJK{Fr4LWnZJRzfLyqf6iuc_g@1O;HG!_|c$Kk{ZN33b6?0SP>nF zgU(gMB8@r(Qw0Gt1>p#F8lT*2v#@x4hu22cdn0`nr_pf4Cr`713w8$CDWG}j{)j?A z2Z#mNIB;;VJGdHC4(K~ii#Q`)SBvDS0!W6^oDhoAQmJfQt+l%(46j}9QPS0X6C39Q za2XqAhAeEK1689Kk15JVDRfkh3q&c|62BJ_`E49Qz+=YQDvLE+DKYWcYPns&!`)Ph z$%`rNG`rPdbU-q#MZ(nclqLj2j5e~7BW9Q-UQV`7X!4OsDSWTe>vE$ylAFs@;t-um z*E#KCzSDqMz#Om?4hAR1t7GtUFs~mD;Fu34rAZ-&i!BZL^gb2e>SbXRiP<1Ugeswq zC9rxzW)xh6G*Xu=D4?>;CW_t$E0`88i5qhHV1y+(v48?bf(ZC*P!RRacTzMg*o~)2f?}yb?@I-Ns2Lt@h~l8~g(}=?z)@ow zU~^gNFfLJ%(zrMzQ;Cf^dPX2pdYxaP*D!#fl=1{%qcFj6fc^jT@yD=$^V`P<=Jv<5 zD#6>dIfcVi2ETqMWBWVE(86G@tfy^1B7^|6>$wAg*^(R5GFC`(tyq zYEPv1nN4k78TXpj&D!2w^!oRj#vJ9YhS8s_T={0e?+^DghEHx==~?WU*fxl@{8HZ6 z{LK)yaA!xWy>bP9;ts{6@n2aQe4pQ4w*K_O#g3}sYvrX!w)O3zR=>itYtO%l(ek@1 zr`Pspb%|SU`1<7szg#x%PsS@c)6lZwByIKcNdASqd{uclAy7C&NB`^TXbKy9A~~=&GoC(A)g`^n!G`_e&ogehZ|%Q-pnb}vCiZ*FS}J5S zYKyZTG+HH}_OuK>t!A$;ZJSjuA6yZ`YdUygzw$_@VYx3$dTWvJAw7OW-tL)k1CNHU zcgz00uhpcV_k{aB9Tto!p(x^D5XIOACyYz$tb3a)j>YwK=rnrAx;!8lT6P9NLj7k2wAr zI8J{oJGyV%jlAVG{_uHV$$mgxS?YiOD5`PcX;tF5#qjL7v3$uYkn;2UnP0EX>zFE? z9|u(u#b@`zoOKJ>-hneD5ov~y6Y6}E7_G3y=iMXL+9Pq)9$ zU5|>X4TkgdUmSfJGw^gaAepHg$bV6Pwf)Biq|Q~C**B}<^`2D)mP^ggrc+~Du62qM z$JK_y2i{ARE-G}l^OGOP#6SBgnYbl`8VB|FzOxniv?GJnlO}H(Zf&2^;Ch+$*|hq} zP#^}Xy}UZNGzpO32BAIf$rl&@m~r*^rSdt^;q0jX$s6*}JNgEsbxybT*XtkEZ}HEm zuNj@#zP+k+Q`IfjzbZn${GJkf?Am1?@aj@C)930^FML-uqhaCcdBt7KHQ&0$nQ56z zsyanGrJB>r#|&V39{|eT6(=?i>a3EfJuL$@>Q5+fB3k9C!o#t9c6@&_P1&I%@#&Zt>rIWdAr%+`qfJpL9z8^)asW#KQQuI zi;9N0LqB{T*ZZUi_4_(AkBKGqudei+d~xyI^KfOECt*WP==!kezqj_^Yr6RA%Iw&| vGjMTI`0|Ye73tyBeojUuFQ5zZl2)|&qTjgjal literal 0 HcmV?d00001 diff --git a/Examples/TrussGenerator_2D/sources/diag_7.png b/Examples/TrussGenerator_2D/sources/diag_7.png new file mode 100644 index 0000000000000000000000000000000000000000..30245e036939222a722677a12d5bb1677aa7d140 GIT binary patch literal 2954 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

    !RX>$}bBFAA;{3+v^4_$lhJk%cT+j=C ze5QMXHl#yfZ>Zo1aOF8+of+=y2F3mlpHy zN;6QjGhyEthDn)&n~|@tXoxnb4Gv7%JIemyl~an5M50=Pf`ij#&1(>N)3Ltf@e=E) zwP)A*wJ)m3qCYru56UfTr+`M^HK#}6n22yvC)huhZ_KkzfkZDFvJl{4KI>CnjEa7R z)Q7cq_=;@+4zPs$lHX2Uhw&p+pas-NoDxEgH^CIsm+a`y`1#AB#l-4*{EP?{C5Jlt zu^Y(uHcJt3A5q9jjBX;#C~b1w8(MohylHJRw)Xliee?3*Uc>?)kN2~nnSlqt2{s7C z#DIgnbOtZ-KpMCdd+WB%yVPVvCqUti5NhJ#oQXLG@6zL$MG{|Mk&xhz&|TL;;Uj&h zE%R{NHpD%;f{K18X{aXFLSTjuilpKj9gG?L_6E%!*G7VOUmvn-L_JAp$G%Rqk3D#(3q_Nk2;02@`?dw-w9SWWkQUOgXB;}qr*jL|zHUq>B7IrKP2Ve@5J=P}`xP?a zs?tA0MOMzWpStig7>u*)=Cv%^KQm&R?!1s;pSYO#S)gY`xT+lRI#$#@!Cj@m@GNdU R4S{10BrUEWRwiQL|9@|fu;Ty# literal 0 HcmV?d00001 diff --git a/Examples/TrussGenerator_2D/sources/truss_1.png b/Examples/TrussGenerator_2D/sources/truss_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a2c5e619335716d8d8aeec6eddd95dbb6d21c3c9 GIT binary patch literal 2055 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 literal 0 HcmV?d00001 diff --git a/Examples/TrussGenerator_2D/sources/truss_3.png b/Examples/TrussGenerator_2D/sources/truss_3.png new file mode 100644 index 0000000000000000000000000000000000000000..61297938acd355d1db1729d2d14e7bc8f6771466 GIT binary patch literal 2454 zcmYjTdsI~A7DpEsP%9Cwyo8$Ch*{vAd5;n>XWsAk3^SE9k27b^%$%9w%*>e?Kzzg% z5djOeyei~^do4q6+RX}*TggL7ah2pFAE*SbRJdTJm=yOzY_0px{`U9V`}^&)f9u=d zI+Yrg_{o{+GZPXLo|H-ix`c#j3xS`Vk_7A@?c^D-ObhA6aKfRUjGqz`5Z7AY@Ovucp0)pjc%xTfPp|Zg$@G`1XzqIH^yST z2oPQ{=tIniU5P2Hk8mPjx^dLs1qSE2PjIT(1k$E$EpE-?6FQ-vrtawK!qx*A}D8yR631MI7Q;OfvC5?)tKt_?k>cFWy0t+H44&70#ByhIbs^+l5Lf8|qSH)9cD$ve$=Ou5)kBJSVTOvOD=Ou&?2s$v~omJIL2iAcy@yb z4(f{|EDtQf5hIOnh*=zb4%0_95@riWMhoca0#i|p4SEc@0t{!IAJoY8Z~<;s80;Eu zL_H;4id&1=#F$XBG3x-3C&6e>^| z9Wf3Z3X=j8LDMQdcHAQ+xq3GymTFOc5M;wXhD4|rly&=)iHs7^?*f?y)zZqm>7>iJTg(CLi_;Q$nlhl2u+ z3bcYEBDzHqb&KT?rvMFzIZBS!in5e!8wl#Oz_9&X9bFkFG(oGtq-GF^#_v~4%y2a3 zkjf1>P2$Gw0g{xHPEj0*@nEVMCL{qG!xmKwtW>)`hPoLhnL<;9htwXIC@^`e9wAC5 zSLll?-345`LKRi>87fOeZU<4Fg`q0Yg%kuw!pnBh(%MQbCb`-DeUhY}NvwnP6~X$K-I(!K91+oT^772KJAiEV}T*29gV2 zv@)rHXNavC+AAk|sq=&bOK!h6Kl7vH`Pv-|=XN%~uy+S_+19!hqK}d#o%3$5rwyo9 z4XG{-XTE-N=fS$gl6z<4EnWWA4c*8ek%^)H+h^|=mR-5>TJwk9ue;V{5Afbdn;scD z)MGk-8(*{R#jpFDc643%wt|&0=iFrEy>YW`;;D0Q?JGT!TKlUCoyEA{sc(4Y&gO4>x>t1eEOjkwIN3p8 zzBlRI@WFF))f@4?=EO@q-RXBO-*32m^7LRIJ^p>}2eBI2%_i&T>wZ<&?<=oJ9xeaa z>*{%{p+tKOYnwRu^I_q#ySo%Q&-}#bOJsI+-YgR~<+g4eY?)|&aHMYYY9eiPEPt1` zzyIiqt4B|u(@>8cgiL8?^ano{ru+!SI;hMYrogE za#!K0J-_K{vgB-b4LcjK1KjwL&<#=MPi*H;=+RIg{XHvRq%t?Nwd z^HrIV!xZM4s+7Pd*Y4-%KX|LIH-7b=B<;+6;gW?}s*yJvR&IcZ1uxe_TV5KtUjN_D zk-yf)O5F=;vUU{SDow7;jA)1Mz4JpXE4%gL$XUtGQ!A04V;yxz-aVA1Bl}GXZtj7j^E-d}Qajq7V>yv~ZOdG^y5gI3=Gd>JRReGGM%!0a9+{C^ z3)iAK>934M+D0lz4u5FQ;YuoMtsY-WjcnVjLN@RF*?VtjXCGj-zS7X?Wn53rtInVB zb<9n^p?zwneM6$Sac15ambeM6_|2})*_SMBp{_}m$L7?Q*M4eEDqVavmZm=8<4b^m_l z(CGzduAJ^@IdGYB`FQ{~Ezz7GzU7M?^Vj^Rq%-vJdTZ$WONPvW&r;XtpG>^9X#dT^ zK72+_WkqZK+w8x1EAp+=hg$a@TfMNo?wK5M1;{Dx(9`Cfdum$BR{6EOMJEP|WAhun R0zX;_QlUz42!3PZ{{SZX+q(b& literal 0 HcmV?d00001 diff --git a/Examples/TrussGenerator_2D/sources/truss_4.png b/Examples/TrussGenerator_2D/sources/truss_4.png new file mode 100644 index 0000000000000000000000000000000000000000..5f5d6a59ee13802e7b6fbd8f598a0dfd396ace64 GIT binary patch literal 3482 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 literal 0 HcmV?d00001 diff --git a/Examples/TrussGenerator_2D/sources/truss_5.png b/Examples/TrussGenerator_2D/sources/truss_5.png new file mode 100644 index 0000000000000000000000000000000000000000..db36e18637d648bdf5a1357823b876181b13b556 GIT binary patch literal 4063 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 literal 0 HcmV?d00001 diff --git a/RFEM/initModel.py b/RFEM/initModel.py index eb51c1fe..5e77b81f 100644 --- a/RFEM/initModel.py +++ b/RFEM/initModel.py @@ -1,4 +1,6 @@ import sys + +from suds import transport from RFEM.enums import * #import json #import xml.etree.ElementTree as ET From c99d5be090a7ff66d28c79120b820ff71a84afba Mon Sep 17 00:00:00 2001 From: KaratasD Date: Wed, 29 Dec 2021 16:14:52 +0100 Subject: [PATCH 02/13] added example --- Examples/TrussGenerator_2D/2D_truss.py | 957 +++++++++++++++++++ Examples/TrussGenerator_2D/TrussGenerator.py | 395 ++++---- 2 files changed, 1190 insertions(+), 162 deletions(-) create mode 100644 Examples/TrussGenerator_2D/2D_truss.py diff --git a/Examples/TrussGenerator_2D/2D_truss.py b/Examples/TrussGenerator_2D/2D_truss.py new file mode 100644 index 00000000..609a9108 --- /dev/null +++ b/Examples/TrussGenerator_2D/2D_truss.py @@ -0,0 +1,957 @@ +import sys +import numpy as np +sys.path.append(r'.') +from RFEM.enums import * +from RFEM.window import * +from RFEM.dataTypes import * +from RFEM.initModel import * +from RFEM.BasicObjects.material import * +from RFEM.BasicObjects.section import * +from RFEM.BasicObjects.thickness import * +from RFEM.BasicObjects.node import * +from RFEM.BasicObjects.line import * +from RFEM.BasicObjects.member import * +from RFEM.BasicObjects.surface import * +from RFEM.BasicObjects.solid import * +from RFEM.BasicObjects.opening import * +from RFEM.BasicObjects.lineSet import * +from RFEM.BasicObjects.memberSet import * +from RFEM.BasicObjects.surfaceSet import * +from RFEM.BasicObjects.solidSet import * +from RFEM.TypesForNodes.nodalSupport import * +from RFEM.TypesForMembers.memberHinge import * +from RFEM.LoadCasesAndCombinations.staticAnalysisSettings import * +from RFEM.LoadCasesAndCombinations.loadCase import * +from RFEM.Loads.nodalLoad import * +from RFEM.Loads.memberLoad import * +from RFEM.Loads.surfaceLoad import * + +def truss_1(diagonal_type, + number_of_bays, + total_length, + total_height, + upper_chord_material, + upper_chord_section, + lower_chord_material, + lower_chord_section, + diagonal_material, + diagonal_section, + vertical_material, + vertical_section): + + if __name__ == '__main__': + + Model(False) + Model.clientModel.service.reset() + Model.clientModel.service.begin_modification('new') + + # Create Materials + Material(1, upper_chord_material) + Material(2, lower_chord_material) + Material(3, diagonal_material) + Material(4, vertical_material) + + # Create Sections + Section(1, upper_chord_section, 1) + Section(2, lower_chord_section, 2) + Section(3, diagonal_section, 3) + Section(4, vertical_section, 4) + + # Create Nodes + x_nodes = np.repeat(np.arange(0, total_length + total_length/number_of_bays, total_length/number_of_bays), 2) + z_nodes = (0, (-total_height))*int((len(x_nodes)/2)) + tag_nodes = np.arange(1, len(x_nodes)+1, 1) + + for tag,x,z in zip(tag_nodes, x_nodes, z_nodes): + Node(tag, x, 0, z) + + # Create Lower Chord + Member(1, 1, tag_nodes[-2], 0, 2, 2) + + # Create Upper Chord + Member(2, 2, tag_nodes[-1], 0, 1, 1) + + # Create Verticals + i = 1 + j = 1 + while j Date: Tue, 4 Jan 2022 16:31:11 +0100 Subject: [PATCH 03/13] fixed bugs --- Examples/TrussGenerator_2D/2D_truss.py | 957 ------------------- Examples/TrussGenerator_2D/TrussGenerator.py | 72 +- 2 files changed, 62 insertions(+), 967 deletions(-) delete mode 100644 Examples/TrussGenerator_2D/2D_truss.py diff --git a/Examples/TrussGenerator_2D/2D_truss.py b/Examples/TrussGenerator_2D/2D_truss.py deleted file mode 100644 index 609a9108..00000000 --- a/Examples/TrussGenerator_2D/2D_truss.py +++ /dev/null @@ -1,957 +0,0 @@ -import sys -import numpy as np -sys.path.append(r'.') -from RFEM.enums import * -from RFEM.window import * -from RFEM.dataTypes import * -from RFEM.initModel import * -from RFEM.BasicObjects.material import * -from RFEM.BasicObjects.section import * -from RFEM.BasicObjects.thickness import * -from RFEM.BasicObjects.node import * -from RFEM.BasicObjects.line import * -from RFEM.BasicObjects.member import * -from RFEM.BasicObjects.surface import * -from RFEM.BasicObjects.solid import * -from RFEM.BasicObjects.opening import * -from RFEM.BasicObjects.lineSet import * -from RFEM.BasicObjects.memberSet import * -from RFEM.BasicObjects.surfaceSet import * -from RFEM.BasicObjects.solidSet import * -from RFEM.TypesForNodes.nodalSupport import * -from RFEM.TypesForMembers.memberHinge import * -from RFEM.LoadCasesAndCombinations.staticAnalysisSettings import * -from RFEM.LoadCasesAndCombinations.loadCase import * -from RFEM.Loads.nodalLoad import * -from RFEM.Loads.memberLoad import * -from RFEM.Loads.surfaceLoad import * - -def truss_1(diagonal_type, - number_of_bays, - total_length, - total_height, - upper_chord_material, - upper_chord_section, - lower_chord_material, - lower_chord_section, - diagonal_material, - diagonal_section, - vertical_material, - vertical_section): - - if __name__ == '__main__': - - Model(False) - Model.clientModel.service.reset() - Model.clientModel.service.begin_modification('new') - - # Create Materials - Material(1, upper_chord_material) - Material(2, lower_chord_material) - Material(3, diagonal_material) - Material(4, vertical_material) - - # Create Sections - Section(1, upper_chord_section, 1) - Section(2, lower_chord_section, 2) - Section(3, diagonal_section, 3) - Section(4, vertical_section, 4) - - # Create Nodes - x_nodes = np.repeat(np.arange(0, total_length + total_length/number_of_bays, total_length/number_of_bays), 2) - z_nodes = (0, (-total_height))*int((len(x_nodes)/2)) - tag_nodes = np.arange(1, len(x_nodes)+1, 1) - - for tag,x,z in zip(tag_nodes, x_nodes, z_nodes): - Node(tag, x, 0, z) - - # Create Lower Chord - Member(1, 1, tag_nodes[-2], 0, 2, 2) - - # Create Upper Chord - Member(2, 2, tag_nodes[-1], 0, 1, 1) - - # Create Verticals - i = 1 - j = 1 - while j Date: Wed, 12 Jan 2022 13:11:59 +0100 Subject: [PATCH 04/13] fixed bugs --- Examples/TrussGenerator_2D/TrussGenerator.py | 537 +++++++++---------- 1 file changed, 260 insertions(+), 277 deletions(-) diff --git a/Examples/TrussGenerator_2D/TrussGenerator.py b/Examples/TrussGenerator_2D/TrussGenerator.py index 4990aa57..773c871f 100644 --- a/Examples/TrussGenerator_2D/TrussGenerator.py +++ b/Examples/TrussGenerator_2D/TrussGenerator.py @@ -752,7 +752,7 @@ def click(self): msg.exec_() # Create Nodes - x_nodes = np.repeat(np.arange(0, total_length + total_length/number_of_bays, total_length/number_of_bays), 2) + x_nodes = np.repeat(np.arange(0, total_length + total_length/number_of_bays -0.1, total_length/number_of_bays), 2) z_nodes = (0, (-total_height))*int((len(x_nodes)/2)) tag_nodes = np.arange(1, len(x_nodes)+1, 1) @@ -923,7 +923,7 @@ def click(self): msg.exec_() # Create Nodes - x_nodes = np.repeat(np.arange(0, total_length + total_length/number_of_bays, total_length/number_of_bays), 2) + x_nodes = np.repeat(np.arange(0, total_length + total_length/number_of_bays -0.1, total_length/number_of_bays), 2) z_nodes = (0, (-total_height))*int((len(x_nodes)/2)) tag_nodes = np.arange(1, len(x_nodes)+1, 1) @@ -954,14 +954,14 @@ def click(self): i +=2 j +=1 #Add first span - # Node(tag_nodes[-1]+1, (-first_span), 0, -total_height) - # Node(tag_nodes[-1]+2, (total_length+first_span), 0, -total_height) + Node(tag_nodes[-1]+1, (-first_span), 0, -total_height) + Node(tag_nodes[-1]+2, (total_length+first_span), 0, -total_height) - # Member((int(diagonal_tag[-1])+1), tag_nodes[-1]+1, tag_nodes[1], 0, 1, 1, 0, 0) - # Member((int(diagonal_tag[-1])+2), tag_nodes[-1]+2, tag_nodes[-1], 0, 2, 2, 0, 0) + Member((int(diagonal_tag[-1])+1), tag_nodes[-1]+1, tag_nodes[1], 0, 1, 1, 0, 0) + Member((int(diagonal_tag[-1])+2), tag_nodes[-1]+2, tag_nodes[-1], 0, 2, 2, 0, 0) - # Member.Truss(0, (int(diagonal_tag[-1])+3), tag_nodes[0], tag_nodes[-1]+1, section_no=3) - # Member.Truss(0, (int(diagonal_tag[-1])+4), tag_nodes[-2], tag_nodes[-1]+2, section_no=3) + Member.Truss(0, (int(diagonal_tag[-1])+3), tag_nodes[0], tag_nodes[-1]+1, section_no=3) + Member.Truss(0, (int(diagonal_tag[-1])+4), tag_nodes[-2], tag_nodes[-1]+2, section_no=3) elif self.diag_2.isChecked(): diagonal_tag = np.arange((len(tag_nodes)/2 + 3), (len(tag_nodes)/2 + 3) + number_of_bays, 1) @@ -1170,7 +1170,7 @@ def click(self): msg.exec_() # Create Nodes - x_nodes = np.repeat(np.arange(0, total_length + total_length/number_of_bays, total_length/number_of_bays), 2) + x_nodes = np.repeat(np.arange(0, total_length + total_length/number_of_bays -0.1, total_length/number_of_bays), 2) z_nodes = (0, (-total_height))*int((len(x_nodes)/2)) tag_nodes = np.arange(1, len(x_nodes)+1, 1) @@ -1375,125 +1375,125 @@ def click(self): elif self.truss_4.isChecked(): - model_list = client.service.get_model_list() - if not model_list: - Model(True, "MyTruss") - else: - if Model.clientModel is None: - Model(False, "MyTruss") - - Model.clientModel.service.reset() - Model.clientModel.service.begin_modification() - - # Create Materials - try: - Material(1, upper_chord_material) - Material(2, lower_chord_material) - Material(3, diagonal_material) - Material(4, vertical_material) - except: - msg = QtWidgets.QMessageBox() - msg.setIcon(QtWidgets.QMessageBox.Critical) - msg.setText("WARNING") - msg.setInformativeText("WARNING: Please enter valid material values.") - msg.setWindowTitle("WARNING") - msg.exec_() + if (number_of_bays % 2) == 0: + model_list = client.service.get_model_list() + if not model_list: + Model(True, "MyTruss") + else: + if Model.clientModel is None: + Model(False, "MyTruss") + + Model.clientModel.service.reset() + Model.clientModel.service.begin_modification() + + # Create Materials + try: + Material(1, upper_chord_material) + Material(2, lower_chord_material) + Material(3, diagonal_material) + Material(4, vertical_material) + except: + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.Critical) + msg.setText("WARNING") + msg.setInformativeText("WARNING: Please enter valid material values.") + msg.setWindowTitle("WARNING") + msg.exec_() - # Create Sections - try: - Section(1, upper_chord_section, 1) - Section(2, lower_chord_section, 2) - Section(3, diagonal_section, 3) - Section(4, vertical_section, 4) - except: - msg = QtWidgets.QMessageBox() - msg.setIcon(QtWidgets.QMessageBox.Critical) - msg.setText("WARNING") - msg.setInformativeText("WARNING: Please enter valid section values.") - msg.setWindowTitle("WARNING") - msg.exec_() + # Create Sections + try: + Section(1, upper_chord_section, 1) + Section(2, lower_chord_section, 2) + Section(3, diagonal_section, 3) + Section(4, vertical_section, 4) + except: + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.Critical) + msg.setText("WARNING") + msg.setInformativeText("WARNING: Please enter valid section values.") + msg.setWindowTitle("WARNING") + msg.exec_() - # Create Nodes - x_nodes = [0] - for i in np.arange(total_length/number_of_bays, total_length, total_length/number_of_bays): - x_nodes.append(i) - x_nodes.append(i) - x_nodes.append(total_length) - - z_nodes = [0] - for i in np.arange(((total_length/number_of_bays) * total_height)/(total_length/2), total_height + 0.1, ((total_length/number_of_bays) * total_height)/(total_length/2)): - z_nodes.append(0) - z_nodes.append(-i) - for i in z_nodes[::-1][1:-1]: - z_nodes.append(i) + # Create Nodes + x_nodes = [0] + for i in np.arange(total_length/number_of_bays, total_length, total_length/number_of_bays): + x_nodes.append(i) + x_nodes.append(i) + x_nodes.append(total_length) - tag_nodes = np.arange(1, len(x_nodes)+1, 1) + z_nodes = [0] + for i in np.arange(((total_length/number_of_bays) * total_height)/(total_length/2), total_height + 0.1, ((total_length/number_of_bays) * total_height)/(total_length/2)): + z_nodes.append(0) + z_nodes.append(-i) + for i in z_nodes[::-1][1:-1]: + z_nodes.append(i) - for tag,x,z in zip(tag_nodes, x_nodes, z_nodes): - Node(tag, x, 0, z) + tag_nodes = np.arange(1, len(x_nodes)+1, 1) - # Create Lower Chord - Member(1, 1, tag_nodes[-1], 0, 2, 2) + for tag,x,z in zip(tag_nodes, x_nodes, z_nodes): + Node(tag, x, 0, z) - # Create Upper Chord - Member(2, 1, int(sum(tag_nodes) / len(tag_nodes) + 0.5), 0, 1, 1) - Member(3, int(sum(tag_nodes) / len(tag_nodes) + 0.5), tag_nodes[-1], 0, 1, 1) + # Create Lower Chord + Member(1, 1, tag_nodes[-1], 0, 2, 2) - # Create Verticals - i = 1 - j = 1 - while j Date: Fri, 14 Jan 2022 11:02:40 +0100 Subject: [PATCH 05/13] update --- Examples/TrussGenerator_2D/TrussGenerator.py | 1499 ++++++++---------- RFEM/initModel.py | 18 +- 2 files changed, 692 insertions(+), 825 deletions(-) diff --git a/Examples/TrussGenerator_2D/TrussGenerator.py b/Examples/TrussGenerator_2D/TrussGenerator.py index 773c871f..b06bbfec 100644 --- a/Examples/TrussGenerator_2D/TrussGenerator.py +++ b/Examples/TrussGenerator_2D/TrussGenerator.py @@ -711,32 +711,19 @@ def click(self): first_span = float(self.firstspan_input.text()) side_height = float(self.sideheight_input.text()) - if self.truss_1.isChecked(): + allGood = True - model_list = client.service.get_model_list() - if not model_list: - Model(True, "MyTruss") - else: - if Model.clientModel is None: - Model(False, "MyTruss") - - Model.clientModel.service.reset() - Model.clientModel.service.begin_modification() - - # Create Materials - try: - Material(1, upper_chord_material) - Material(2, lower_chord_material) - Material(3, diagonal_material) - Material(4, vertical_material) - except: - msg = QtWidgets.QMessageBox() - msg.setIcon(QtWidgets.QMessageBox.Critical) - msg.setText("WARNING") - msg.setInformativeText("WARNING: Please enter valid material values.") - msg.setWindowTitle("WARNING") - msg.exec_() + if Model.clientModel is None: + Model(True, "MyTruss") + Model.clientModel.service.reset() + Model.clientModel.service.begin_modification() + # Create Materials + try: + Material(1, upper_chord_material) + Material(2, lower_chord_material) + Material(3, diagonal_material) + Material(4, vertical_material) # Create Sections try: Section(1, upper_chord_section, 1) @@ -744,6 +731,7 @@ def click(self): Section(3, diagonal_section, 3) Section(4, vertical_section, 4) except: + allGood = False msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Critical) msg.setText("WARNING") @@ -751,333 +739,254 @@ def click(self): msg.setWindowTitle("WARNING") msg.exec_() - # Create Nodes - x_nodes = np.repeat(np.arange(0, total_length + total_length/number_of_bays -0.1, total_length/number_of_bays), 2) - z_nodes = (0, (-total_height))*int((len(x_nodes)/2)) - tag_nodes = np.arange(1, len(x_nodes)+1, 1) + except: + allGood = False + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.Critical) + msg.setText("WARNING") + msg.setInformativeText("WARNING: Please enter valid material values.") + msg.setWindowTitle("WARNING") + msg.exec_() + + Model.clientModel.service.finish_modification() + + if allGood: + if self.truss_1.isChecked(): + Model.clientModel.service.begin_modification() - for tag,x,z in zip(tag_nodes, x_nodes, z_nodes): - Node(tag, x, 0, z) + # Create Nodes + x_nodes = np.repeat(np.arange(0, total_length + total_length/number_of_bays -0.1, total_length/number_of_bays), 2) + z_nodes = (0, (-total_height))*int((len(x_nodes)/2)) + tag_nodes = np.arange(1, len(x_nodes)+1, 1) - # Create Lower Chord - Member(1, 1, tag_nodes[-2], 0, 2, 2) + for tag,x,z in zip(tag_nodes, x_nodes, z_nodes): + Node(tag, x, 0, z) - # Create Upper Chord - Member(2, 2, tag_nodes[-1], 0, 1, 1) + # Create Lower Chord + Member(1, 1, tag_nodes[-2], 0, 2, 2) - # Create Verticals - i = 1 - j = 1 - while j Date: Thu, 20 Jan 2022 13:27:57 +0100 Subject: [PATCH 06/13] removing persistent() fuction --- RFEM/initModel.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/RFEM/initModel.py b/RFEM/initModel.py index 1b1854bd..a8fcdb14 100644 --- a/RFEM/initModel.py +++ b/RFEM/initModel.py @@ -126,13 +126,10 @@ # the message: 'Application is locked by external connection' # is blinking whole time and the execution is unnecessarily long. # This solution works with unit-tests. -def persistent(): - session = requests.Session() - adapter = requests.adapters.HTTPAdapter(pool_connections=1, pool_maxsize=1) - session.mount('http://', adapter) - return suds_requests.RequestsTransport(session) - -trans = persistent() +session = requests.Session() +adapter = requests.adapters.HTTPAdapter(pool_connections=1, pool_maxsize=1) +session.mount('http://', adapter) +trans = suds_requests.RequestsTransport(session) class Model(): clientModel = None From fb2fb4b06b6d35b39b7fcccc85a64713536422d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Michal?= <37547309+OndraMichal@users.noreply.github.com> Date: Thu, 20 Jan 2022 13:31:05 +0100 Subject: [PATCH 07/13] aligning the boxes --- Examples/TrussGenerator_2D/TrussGenerator.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Examples/TrussGenerator_2D/TrussGenerator.py b/Examples/TrussGenerator_2D/TrussGenerator.py index b06bbfec..00e716f0 100644 --- a/Examples/TrussGenerator_2D/TrussGenerator.py +++ b/Examples/TrussGenerator_2D/TrussGenerator.py @@ -681,11 +681,11 @@ def setupUi(self, MainWindow): def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "2D Truss Generator")) - self.bay_label.setText(_translate("MainWindow", "Number of Bays: ")) - self.length_label.setText(_translate("MainWindow", "Total Length (m): ")) - self.height_label.setText(_translate("MainWindow", "Total Height (m): ")) - self.height_label_2.setText(_translate("MainWindow", "First Span (m): ")) - self.sideheight_label.setText(_translate("MainWindow", "Side Height (m): ")) + self.bay_label.setText(_translate("MainWindow", "Number of Bays:\t")) + self.length_label.setText(_translate("MainWindow", "Total Length (m):\t")) + self.height_label.setText(_translate("MainWindow", "Total Height (m):\t")) + self.height_label_2.setText(_translate("MainWindow", "First Span (m):\t")) + self.sideheight_label.setText(_translate("MainWindow", "Side Height (m):\t")) self.upperchord_label.setText(_translate("MainWindow", "Upper Chord")) self.verticals_label.setText(_translate("MainWindow", "Verticals ")) self.lowerchord_label.setText(_translate("MainWindow", "Lower Chord")) @@ -716,7 +716,7 @@ def click(self): if Model.clientModel is None: Model(True, "MyTruss") - Model.clientModel.service.reset() + Model.clientModel.service.delete_all() Model.clientModel.service.begin_modification() # Create Materials try: @@ -1592,4 +1592,4 @@ def close(self): ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() - sys.exit(app.exec_()) \ No newline at end of file + sys.exit(app.exec_()) From 01659e13c9146aad9d5071146581dcd6edf7a22b Mon Sep 17 00:00:00 2001 From: KaratasD Date: Thu, 20 Jan 2022 15:14:40 +0100 Subject: [PATCH 08/13] fixed bugs --- Examples/TrussGenerator_2D/TrussGenerator.py | 1512 ++++++++++-------- 1 file changed, 826 insertions(+), 686 deletions(-) diff --git a/Examples/TrussGenerator_2D/TrussGenerator.py b/Examples/TrussGenerator_2D/TrussGenerator.py index 00e716f0..ff93b4bc 100644 --- a/Examples/TrussGenerator_2D/TrussGenerator.py +++ b/Examples/TrussGenerator_2D/TrussGenerator.py @@ -681,11 +681,11 @@ def setupUi(self, MainWindow): def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "2D Truss Generator")) - self.bay_label.setText(_translate("MainWindow", "Number of Bays:\t")) - self.length_label.setText(_translate("MainWindow", "Total Length (m):\t")) - self.height_label.setText(_translate("MainWindow", "Total Height (m):\t")) - self.height_label_2.setText(_translate("MainWindow", "First Span (m):\t")) - self.sideheight_label.setText(_translate("MainWindow", "Side Height (m):\t")) + self.bay_label.setText(_translate("MainWindow", "Number of Bays: ")) + self.length_label.setText(_translate("MainWindow", "Total Length (m): ")) + self.height_label.setText(_translate("MainWindow", "Total Height (m): ")) + self.height_label_2.setText(_translate("MainWindow", "First Span (m): ")) + self.sideheight_label.setText(_translate("MainWindow", "Side Height (m): ")) self.upperchord_label.setText(_translate("MainWindow", "Upper Chord")) self.verticals_label.setText(_translate("MainWindow", "Verticals ")) self.lowerchord_label.setText(_translate("MainWindow", "Lower Chord")) @@ -711,19 +711,32 @@ def click(self): first_span = float(self.firstspan_input.text()) side_height = float(self.sideheight_input.text()) - allGood = True + if self.truss_1.isChecked(): - if Model.clientModel is None: - Model(True, "MyTruss") + model_list = client.service.get_model_list() + if not model_list: + Model(True, "MyTruss") + else: + if Model.clientModel is None: + Model(False, "MyTruss") + + Model.clientModel.service.reset() + Model.clientModel.service.begin_modification() + + # Create Materials + try: + Material(1, upper_chord_material) + Material(2, lower_chord_material) + Material(3, diagonal_material) + Material(4, vertical_material) + except: + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.Critical) + msg.setText("WARNING") + msg.setInformativeText("WARNING: Please enter valid material values.") + msg.setWindowTitle("WARNING") + msg.exec_() - Model.clientModel.service.delete_all() - Model.clientModel.service.begin_modification() - # Create Materials - try: - Material(1, upper_chord_material) - Material(2, lower_chord_material) - Material(3, diagonal_material) - Material(4, vertical_material) # Create Sections try: Section(1, upper_chord_section, 1) @@ -731,7 +744,6 @@ def click(self): Section(3, diagonal_section, 3) Section(4, vertical_section, 4) except: - allGood = False msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Critical) msg.setText("WARNING") @@ -739,254 +751,333 @@ def click(self): msg.setWindowTitle("WARNING") msg.exec_() - except: - allGood = False - msg = QtWidgets.QMessageBox() - msg.setIcon(QtWidgets.QMessageBox.Critical) - msg.setText("WARNING") - msg.setInformativeText("WARNING: Please enter valid material values.") - msg.setWindowTitle("WARNING") - msg.exec_() - - Model.clientModel.service.finish_modification() - - if allGood: - if self.truss_1.isChecked(): - Model.clientModel.service.begin_modification() + # Create Nodes + x_nodes = np.repeat(np.arange(0, total_length + total_length/number_of_bays -0.1, total_length/number_of_bays), 2) + z_nodes = (0, (-total_height))*int((len(x_nodes)/2)) + tag_nodes = np.arange(1, len(x_nodes)+1, 1) - # Create Nodes - x_nodes = np.repeat(np.arange(0, total_length + total_length/number_of_bays -0.1, total_length/number_of_bays), 2) - z_nodes = (0, (-total_height))*int((len(x_nodes)/2)) - tag_nodes = np.arange(1, len(x_nodes)+1, 1) + for tag,x,z in zip(tag_nodes, x_nodes, z_nodes): + Node(tag, x, 0, z) - for tag,x,z in zip(tag_nodes, x_nodes, z_nodes): - Node(tag, x, 0, z) + # Create Lower Chord + Member(1, 1, tag_nodes[-2], 0, 2, 2) - # Create Lower Chord - Member(1, 1, tag_nodes[-2], 0, 2, 2) + # Create Upper Chord + Member(2, 2, tag_nodes[-1], 0, 1, 1) - # Create Upper Chord - Member(2, 2, tag_nodes[-1], 0, 1, 1) + # Create Verticals + i = 1 + j = 1 + while j Date: Thu, 20 Jan 2022 16:03:23 +0100 Subject: [PATCH 09/13] updated for review --- Examples/TrussGenerator_2D/TrussGenerator.py | 1510 ++++++++---------- 1 file changed, 685 insertions(+), 825 deletions(-) diff --git a/Examples/TrussGenerator_2D/TrussGenerator.py b/Examples/TrussGenerator_2D/TrussGenerator.py index ff93b4bc..818c0bb5 100644 --- a/Examples/TrussGenerator_2D/TrussGenerator.py +++ b/Examples/TrussGenerator_2D/TrussGenerator.py @@ -681,11 +681,11 @@ def setupUi(self, MainWindow): def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "2D Truss Generator")) - self.bay_label.setText(_translate("MainWindow", "Number of Bays: ")) - self.length_label.setText(_translate("MainWindow", "Total Length (m): ")) - self.height_label.setText(_translate("MainWindow", "Total Height (m): ")) - self.height_label_2.setText(_translate("MainWindow", "First Span (m): ")) - self.sideheight_label.setText(_translate("MainWindow", "Side Height (m): ")) + self.bay_label.setText(_translate("MainWindow", "Number of Bays:\t")) + self.length_label.setText(_translate("MainWindow", "Total Length (m):\t")) + self.height_label.setText(_translate("MainWindow", "Total Height (m):\t")) + self.height_label_2.setText(_translate("MainWindow", "First Span (m):\t")) + self.sideheight_label.setText(_translate("MainWindow", "Side Height (m):\t")) self.upperchord_label.setText(_translate("MainWindow", "Upper Chord")) self.verticals_label.setText(_translate("MainWindow", "Verticals ")) self.lowerchord_label.setText(_translate("MainWindow", "Lower Chord")) @@ -711,32 +711,19 @@ def click(self): first_span = float(self.firstspan_input.text()) side_height = float(self.sideheight_input.text()) - if self.truss_1.isChecked(): + allGood = True - model_list = client.service.get_model_list() - if not model_list: - Model(True, "MyTruss") - else: - if Model.clientModel is None: - Model(False, "MyTruss") - - Model.clientModel.service.reset() - Model.clientModel.service.begin_modification() - - # Create Materials - try: - Material(1, upper_chord_material) - Material(2, lower_chord_material) - Material(3, diagonal_material) - Material(4, vertical_material) - except: - msg = QtWidgets.QMessageBox() - msg.setIcon(QtWidgets.QMessageBox.Critical) - msg.setText("WARNING") - msg.setInformativeText("WARNING: Please enter valid material values.") - msg.setWindowTitle("WARNING") - msg.exec_() + if Model.clientModel is None: + Model(True, "MyTruss") + Model.clientModel.service.delete_all() + Model.clientModel.service.begin_modification() + # Create Materials + try: + Material(1, upper_chord_material) + Material(2, lower_chord_material) + Material(3, diagonal_material) + Material(4, vertical_material) # Create Sections try: Section(1, upper_chord_section, 1) @@ -744,6 +731,7 @@ def click(self): Section(3, diagonal_section, 3) Section(4, vertical_section, 4) except: + allGood = False msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Critical) msg.setText("WARNING") @@ -751,333 +739,254 @@ def click(self): msg.setWindowTitle("WARNING") msg.exec_() - # Create Nodes - x_nodes = np.repeat(np.arange(0, total_length + total_length/number_of_bays -0.1, total_length/number_of_bays), 2) - z_nodes = (0, (-total_height))*int((len(x_nodes)/2)) - tag_nodes = np.arange(1, len(x_nodes)+1, 1) + except: + allGood = False + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.Critical) + msg.setText("WARNING") + msg.setInformativeText("WARNING: Please enter valid material values.") + msg.setWindowTitle("WARNING") + msg.exec_() + + Model.clientModel.service.finish_modification() + + if allGood: + if self.truss_1.isChecked(): + Model.clientModel.service.begin_modification() - for tag,x,z in zip(tag_nodes, x_nodes, z_nodes): - Node(tag, x, 0, z) + # Create Nodes + x_nodes = np.repeat(np.arange(0, total_length + total_length/number_of_bays -0.1, total_length/number_of_bays), 2) + z_nodes = (0, (-total_height))*int((len(x_nodes)/2)) + tag_nodes = np.arange(1, len(x_nodes)+1, 1) - # Create Lower Chord - Member(1, 1, tag_nodes[-2], 0, 2, 2) + for tag,x,z in zip(tag_nodes, x_nodes, z_nodes): + Node(tag, x, 0, z) - # Create Upper Chord - Member(2, 2, tag_nodes[-1], 0, 1, 1) + # Create Lower Chord + Member(1, 1, tag_nodes[-2], 0, 2, 2) - # Create Verticals - i = 1 - j = 1 - while j Date: Fri, 21 Jan 2022 09:55:07 +0100 Subject: [PATCH 10/13] fixed bugs --- Examples/TrussGenerator_2D/TrussGenerator.py | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Examples/TrussGenerator_2D/TrussGenerator.py b/Examples/TrussGenerator_2D/TrussGenerator.py index 818c0bb5..4da5aad9 100644 --- a/Examples/TrussGenerator_2D/TrussGenerator.py +++ b/Examples/TrussGenerator_2D/TrussGenerator.py @@ -1348,8 +1348,8 @@ def click(self): diagonal_tag = np.arange(number_of_bays+3, 2*number_of_bays+2, 1) i = 1 j = int(diagonal_tag[0]) - while i < len(tag_nodes) and j < int(diagonal_tag[-1] + 1): - Member.Truss(0, j, i+2, i+3, section_no=3) + while i < len(tag_nodes)-1 and j < int(diagonal_tag[-1]): + Member.Truss(0, j, i+1, i+4, section_no=3) i +=2 j +=1 @@ -1357,8 +1357,8 @@ def click(self): diagonal_tag = np.arange(number_of_bays+3, 2*number_of_bays+2, 1) i = 1 j = int(diagonal_tag[0]) - while i < len(tag_nodes)-1 and j < int(diagonal_tag[-1]): - Member.Truss(0, j, i+1, i+4, section_no=3) + while i < len(tag_nodes) and j < int(diagonal_tag[-1] + 1): + Member.Truss(0, j, i+2, i+3, section_no=3) i +=2 j +=1 @@ -1393,13 +1393,13 @@ def click(self): i = 1 j = int(diagonal_tag[0]) while i < (tag_nodes[-1]/2) and j Date: Fri, 21 Jan 2022 10:05:15 +0100 Subject: [PATCH 11/13] fixed bugs --- Examples/TrussGenerator_2D/TrussGenerator.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Examples/TrussGenerator_2D/TrussGenerator.py b/Examples/TrussGenerator_2D/TrussGenerator.py index 4da5aad9..8ba7b768 100644 --- a/Examples/TrussGenerator_2D/TrussGenerator.py +++ b/Examples/TrussGenerator_2D/TrussGenerator.py @@ -1506,10 +1506,10 @@ def click(self): i = 1 j = int(diagonal_tag[0]) k = 1 - while i < len(tag_nodes) +2 and j < diagonal_tag[-1] + 2 and k < len(tag_nodes) : - Member.Truss(0, j, i+1, i+2, section_no=3) + while i < len(tag_nodes) +2 and j < diagonal_tag[-1] + 2 and k < len(tag_nodes) : + Member.Truss(0, j, i, i+3, section_no=3) j += 1 - Member.Truss(0, j, k+2, k+5, section_no=3) + Member.Truss(0, j, k+3, k+4, section_no=3) i += 4 k += 4 j += 1 @@ -1519,10 +1519,10 @@ def click(self): i = 1 j = int(diagonal_tag[0]) k = 1 - while i < len(tag_nodes) +2 and j < diagonal_tag[-1] + 2 and k < len(tag_nodes) : - Member.Truss(0, j, i, i+3, section_no=3) + while i < len(tag_nodes) +2 and j < diagonal_tag[-1] + 2 and k < len(tag_nodes) : + Member.Truss(0, j, i+1, i+2, section_no=3) j += 1 - Member.Truss(0, j, k+3, k+4, section_no=3) + Member.Truss(0, j, k+2, k+5, section_no=3) i += 4 k += 4 j += 1 From 33e13738e92e29b8676dadcee9c3808ba78a606d Mon Sep 17 00:00:00 2001 From: KaratasD Date: Fri, 21 Jan 2022 10:15:06 +0100 Subject: [PATCH 12/13] updated configurations --- Examples/TrussGenerator_2D/TrussGenerator.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Examples/TrussGenerator_2D/TrussGenerator.py b/Examples/TrussGenerator_2D/TrussGenerator.py index 8ba7b768..fe0b2b29 100644 --- a/Examples/TrussGenerator_2D/TrussGenerator.py +++ b/Examples/TrussGenerator_2D/TrussGenerator.py @@ -828,14 +828,14 @@ def click(self): diagonal_tag = np.arange((len(tag_nodes)/2 + 3), (len(tag_nodes)/2 + 3) + number_of_bays, 1) i = 1 j = int(diagonal_tag[0]) - while i < (tag_nodes[-1]/2) and j Date: Fri, 21 Jan 2022 10:52:50 +0100 Subject: [PATCH 13/13] updated configurations --- Examples/TrussGenerator_2D/TrussGenerator.py | 36 ++++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Examples/TrussGenerator_2D/TrussGenerator.py b/Examples/TrussGenerator_2D/TrussGenerator.py index fe0b2b29..85ba7332 100644 --- a/Examples/TrussGenerator_2D/TrussGenerator.py +++ b/Examples/TrussGenerator_2D/TrussGenerator.py @@ -1002,14 +1002,14 @@ def click(self): diagonal_tag = np.arange((len(tag_nodes)/2 + 3), (len(tag_nodes)/2 + 3) + number_of_bays, 1) i = 1 j = int(diagonal_tag[0]) - while i < (tag_nodes[-1]/2) and j