Skip to content

Commit 9518e66

Browse files
committed
Several update
1 parent 8e009c9 commit 9518e66

11 files changed

Lines changed: 419 additions & 9 deletions

File tree

openstaad/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,6 @@
44
from .output import Output
55
from .properties import Properties
66
from .view import View
7+
from .support import Support
8+
from .command import Command
9+
from .design import Design

openstaad/command.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from openstaad.tools import *
2+
from comtypes import automation
3+
from comtypes import client
4+
5+
class Command():
6+
def __init__(self):
7+
self._staad = client.GetActiveObject("StaadPro.OpenSTAAD")
8+
self._command = self._staad.Command
9+
10+
self._functions= [
11+
'PerformAnalysis',
12+
]
13+
14+
for function_name in self._functions:
15+
self._command._FlagAsMethod(function_name)
16+
17+
def PerformAnalysis(self,print_option:int):
18+
"""
19+
--> 1 - Print Load Data
20+
--> 2 - Print Statics Check
21+
--> 3 - Print Static Load
22+
--> 4 - Print Mode Shapes
23+
--> 5 - Print Both
24+
--> 6 - Print All
25+
--> 0 - No Print
26+
"""
27+
self._command.PerformAnalysis(print_option)

openstaad/design.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from openstaad.tools import *
2+
from comtypes import automation
3+
from comtypes import client
4+
5+
class Design():
6+
def __init__(self):
7+
self._staad = client.GetActiveObject("StaadPro.OpenSTAAD")
8+
self._design = self._staad.Design
9+
10+
self._functions= [
11+
'CreateDesignBrief',
12+
'AssignDesignCommand'
13+
]
14+
15+
for function_name in self._functions:
16+
self._design._FlagAsMethod(function_name)
17+
18+
def CreateDesignBrief(self,design_code:int):
19+
"""
20+
"""
21+
self._design.CreateDesignBrief(design_code)
22+
23+
def AssignDesignCommand(self,brief_reference:int,command_name:str,command_value:str,members:list[int]):
24+
"""
25+
"""
26+
def make_safe_array_long(array):
27+
size = len(array)
28+
return automation._midlSAFEARRAY(ctypes.c_long).create(array)
29+
30+
# Crear SAFEARRAY para 'release'
31+
safe_list_members = make_safe_array_long(members)
32+
members = make_variant_vt_ref(safe_list_members, automation.VT_ARRAY | automation.VT_I4)
33+
34+
self._design.AssignDesignCommand(brief_reference,command_name,command_value,members)

openstaad/geometry.py

Lines changed: 92 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,12 @@ def __init__(self):
3535
'SelectMultipleBeams',
3636
'GetGroupCount',
3737
'GetGroupNames',
38-
'CreatePhysicalMember'
39-
38+
'CreatePhysicalMember',
39+
'AddNode',
40+
'AddBeam',
41+
'DoTranslationalRepeat',
42+
'GetIntersectBeamsCount',
43+
'IntersectBeams'
4044
]
4145

4246
for function_name in self._functions:
@@ -227,3 +231,89 @@ def CreatePhysicalMember(self,member_list:list):
227231
retval=self._geometry.CreatePhysicalMember(num,lista_variant,None)
228232

229233

234+
235+
def AddNode(self,x:float=0.0,y:float=0.0,z:float=0.0):
236+
retval=self._geometry.AddNode(x,y,z)
237+
return retval
238+
239+
def AddBeam(self,node_A,node_B):
240+
retval=self._geometry.AddBeam(node_A,node_B)
241+
return retval
242+
243+
def make_safe_array_long(data):
244+
if not isinstance(data, list):
245+
raise TypeError("Data must be a list of integers")
246+
247+
size = len(data)
248+
safe_array = automation._midlSAFEARRAY(ctypes.c_long).create([0] * size)
249+
250+
for i in range(size):
251+
safe_array[i] = data[i]
252+
253+
return safe_array
254+
255+
def make_variant_vt_ref(safe_array, vt_type):
256+
variant = automation.VARIANT()
257+
variant.vt = vt_type
258+
variant._.parray = safe_array
259+
return variant
260+
261+
def DoTranslationalRepeat(self, varLinkBays: bool, varOpenBase: bool, varAxisDir: int, varSpacingArray: list[float], varNobays: int, varRenumberBay: bool, varRenumberArray: list, varGeometryOnly: bool):
262+
try:
263+
264+
def make_safe_array_double(array):
265+
size = len(array)
266+
return automation._midlSAFEARRAY(ctypes.c_double).create(array)
267+
268+
# Conversión de varSpacingArray
269+
safe_spacing_array = make_safe_array_double(varSpacingArray)
270+
varSpacingArray = make_variant_vt_ref(safe_spacing_array, automation.VT_ARRAY | automation.VT_R8)
271+
272+
retval = self._geometry.DoTranslationalRepeat(varLinkBays, varOpenBase, varAxisDir, varSpacingArray, varNobays, varRenumberBay, varRenumberArray, varGeometryOnly)
273+
return retval
274+
except Exception as e:
275+
print(f"An error occurred in DoTranslationalRepeat: {e}")
276+
raise
277+
278+
def IntersectBeams(self, Method: int, BeamNosArray: list[int], dTolerance: float, NewBeamNosArray: int):
279+
280+
# Conversión de dTolerance
281+
safe_n1 = make_safe_array_double(1)
282+
dTolerance = make_variant_vt_ref(safe_n1, automation.VT_R8)
283+
284+
# Ajuste en make_safe_array_long para manejar listas
285+
def make_safe_array_long(array):
286+
size = len(array)
287+
return automation._midlSAFEARRAY(ctypes.c_long).create(array)
288+
289+
# Conversión de BeamNosArray
290+
safe_beam_list = make_safe_array_long(BeamNosArray)
291+
BeamNosArray = make_variant_vt_ref(safe_beam_list, automation.VT_ARRAY | automation.VT_I4)
292+
293+
# Conversión de NewBeamNosArray
294+
# safe_beam_list = make_safe_array_long(NewBeamNosArray)
295+
# NewBeamNosArray = make_variant_vt_ref(safe_beam_list, automation.VT_ARRAY | automation.VT_I4)
296+
297+
298+
# Llamada a la función interna
299+
retval = self._geometry.IntersectBeams(Method, BeamNosArray, dTolerance, NewBeamNosArray)
300+
return retval
301+
302+
def GetIntersectBeamsCount(self, BeamNosArray: list[int], dTolerance: float):
303+
safe_n1 = make_safe_array_double(1)
304+
dTolerance = make_variant_vt_ref(safe_n1, automation.VT_R8)
305+
306+
def make_safe_array_long(array):
307+
size = len(array)
308+
return automation._midlSAFEARRAY(ctypes.c_long).create(array)
309+
310+
safe_list = make_safe_array_long(BeamNosArray)
311+
BeamNosArray = make_variant_vt_ref(safe_list, automation.VT_ARRAY | automation.VT_I4)
312+
313+
n_beams = self._geometry.GetIntersectBeamsCount(BeamNosArray, dTolerance)
314+
return n_beams
315+
316+
317+
318+
319+

openstaad/load.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,31 @@ def __init__(self):
88
self._load = self._staad.Load
99

1010
self._functions= [
11-
'GetLoadCaseTitle'
11+
'GetLoadCaseTitle',
12+
'AddMemberConcForce',
13+
'SetLoadActive',
14+
'CreateNewPrimaryLoad'
1215
]
1316

1417
for function_name in self._functions:
1518
self._load._FlagAsMethod(function_name)
1619

1720
def GetLoadCaseTitle(self,lc):
1821
return self._load.GetLoadCaseTitle(lc)
22+
23+
def AddMemberConcForce(self,varBeamNo:list[int],varDirection:int,varForce:float,varD1:float,varD2:float):
24+
25+
def make_safe_array_long(array):
26+
size = len(array)
27+
return automation._midlSAFEARRAY(ctypes.c_long).create(array)
28+
29+
safe_list = make_safe_array_long(varBeamNo)
30+
varBeamNo = make_variant_vt_ref(safe_list, automation.VT_ARRAY | automation.VT_I4)
31+
32+
self._load.AddMemberConcForce(varBeamNo,varDirection,varForce,varD1,varD2)
33+
34+
def SetLoadActive(self,varLoadNo:int):
35+
self._load.SetLoadActive(varLoadNo)
36+
37+
def CreateNewPrimaryLoad(self,LoadTitle:str="LOAD CASE X"):
38+
self._load.CreateNewPrimaryLoad(LoadTitle)

openstaad/output.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def GetMemberEndForces(self,beam, start = True, lc :int= 1,local: int = 0):
3131
return x.value[0]
3232

3333
def GetSupportReactions(self, node,lc :int= 1):
34+
3435
safe_n1 = make_safe_array_double(6)
3536
x = make_variant_vt_ref(safe_n1, automation.VT_ARRAY | automation.VT_R8)
3637

openstaad/properties.py

Lines changed: 118 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ def __init__(self):
1313
'GetSectionPropertyValues',
1414
'GetAlphaAngleForSection',
1515
'GetMemberReleaseSpecEx',
16-
'GetMemberSpecCode'
16+
'GetMemberSpecCode',
17+
'CreateBeamPropertyFromTable',
18+
'CreateMemberReleaseSpec',
19+
'AssignMemberSpecToBeam',
20+
'AssignBeamProperty',
21+
'AssignMaterialToMember'
1722
]
1823

1924
for function_name in self._functions:
@@ -164,4 +169,115 @@ def GetMemberSpecCode(self, memb):
164169
make_safe_array_int = make_safe_array_long(1)
165170
spe = make_variant_vt_ref(make_safe_array_int, automation.VT_ARRAY | automation.VT_I4)
166171
# print(Warning('GetMemberSpecCode output could be wrong'))
167-
return int(self._property.GetMemberSpecCode(memb,spe))
172+
return int(self._property.GetMemberSpecCode(memb,spe))
173+
174+
175+
176+
def CreateBeamPropertyFromTable(self,Country_code:int,profile_name:str,type_spec:int=0,spec_1:float=0.0,spec_2:float=0.0):
177+
178+
"""
179+
COUNTRY CODE
180+
1-> American
181+
2-> Australian
182+
3-> British
183+
4-> Canadian
184+
5-> Chinese
185+
6-> Dutch
186+
7-> European
187+
8-> French
188+
9-> German
189+
10-> Indian
190+
11-> Japanese
191+
12-> Russian
192+
13-> Southafrican
193+
14-> Spanish
194+
15-> Venezuelan
195+
16-> Korean
196+
17-> Aluminum
197+
18-> American cold formed
198+
19-> Indian cold formed
199+
20-> Mexican
200+
21-> American Steel Joist
201+
22-> AITCTimber
202+
23-> Lysaght cold formed
203+
24-> British cold formed
204+
25-> Canadian Timber
205+
26-> Butler cold formed
206+
27-> Kingspan cold formed
207+
28-> RCeco cold formed
208+
29-> Japanese cold formed
209+
30-> Australian cold formed
210+
"""
211+
propertyNo = self._property.CreateBeamPropertyFromTable(Country_code,profile_name,type_spec,spec_1,spec_2)
212+
213+
def CreateMemberReleaseSpec(self, location: int, release: list[int], spring_const: list[float]):
214+
"""
215+
LOCATION
216+
0 -> Start
217+
1 -> End
218+
RELEASE
219+
[FX, FY, FZ, MX, MY, MZ]
220+
SPRINGCONST
221+
[KFX, KFY, KFZ, KMX, KMY, KMZ]
222+
"""
223+
224+
def make_safe_array_long(array):
225+
size = len(array)
226+
return automation._midlSAFEARRAY(ctypes.c_long).create(array)
227+
228+
def make_safe_array_double(array):
229+
size = len(array)
230+
return automation._midlSAFEARRAY(ctypes.c_double).create(array)
231+
232+
# Crear SAFEARRAY para 'release'
233+
safe_list_release = make_safe_array_long(release)
234+
release_variant = make_variant_vt_ref(safe_list_release, automation.VT_ARRAY | automation.VT_I4)
235+
236+
# Crear SAFEARRAY para 'spring_const'
237+
safe_list_spring_const = make_safe_array_double(spring_const)
238+
spring_const_variant = make_variant_vt_ref(safe_list_spring_const, automation.VT_ARRAY | automation.VT_R8)
239+
240+
# Llamar a la función con los parámetros correctos
241+
retval = self._property.CreateMemberReleaseSpec(location, release_variant, spring_const_variant)
242+
return retval
243+
244+
def AssignMemberSpecToBeam(self, Beams: list[int], specNo: int):
245+
def make_safe_array_long(array):
246+
size = len(array)
247+
return automation._midlSAFEARRAY(ctypes.c_long).create(array)
248+
249+
# Crear SAFEARRAY para 'release'
250+
safe_list_release = make_safe_array_long(Beams)
251+
Beams = make_variant_vt_ref(safe_list_release, automation.VT_ARRAY | automation.VT_I4)
252+
253+
retval= self._property.AssignMemberSpecToBeam(Beams, specNo)
254+
255+
return retval
256+
257+
def AssignBeamProperty(self, beams_list: list[int], propertyNo: int):
258+
259+
def make_safe_array_long(array):
260+
size = len(array)
261+
return automation._midlSAFEARRAY(ctypes.c_long).create(array)
262+
263+
# Crear SAFEARRAY para 'beamNo'
264+
safe_list = make_safe_array_long(beams_list)
265+
beams_list = make_variant_vt_ref(safe_list, automation.VT_ARRAY | automation.VT_I4)
266+
267+
retval= self._property.AssignBeamProperty(beams_list, propertyNo)
268+
269+
return retval
270+
271+
def AssignMaterialToMember(self, material_name: str, beamNo: list[int]):
272+
273+
def make_safe_array_long(array):
274+
size = len(array)
275+
return automation._midlSAFEARRAY(ctypes.c_long).create(array)
276+
277+
# Crear SAFEARRAY para 'beamNo'
278+
safe_list = make_safe_array_long(beamNo)
279+
beamNo = make_variant_vt_ref(safe_list, automation.VT_ARRAY | automation.VT_I4)
280+
281+
retval= self._property.AssignMaterialToMember(material_name, beamNo)
282+
283+
return retval

0 commit comments

Comments
 (0)