Skip to content

Commit

Permalink
sap.Select added
Browse files Browse the repository at this point in the history
rpakishore committed Mar 8, 2024
1 parent d3357c8 commit a5bb744
Showing 5 changed files with 172 additions and 0 deletions.
37 changes: 37 additions & 0 deletions documentation/Usage.ipynb
Original file line number Diff line number Diff line change
@@ -215,6 +215,43 @@
"tables.update(TableKey='Material Properties 01 - General', data=df, apply=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Select"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"select = sap.Select\n",
"\n",
"select.all() #Select all objects\n",
"select.clear() #Deselect all objects\n",
"\n",
"select.constraint(name='Diaph1')#Select points in constraint\n",
"select.constraint(name='Diaph1', reverse=True) #Deselect points in constraint\n",
"\n",
"select.invert() #Invert selections\n",
"select.selected #Returns list of selected objects\n",
"select.previous() #restores the previous selection\n",
"\n",
"#Selection based on plane\n",
"select.in_plane(pointname='1', plane='XY') #Select in XY plane\n",
"select.in_plane(pointname='2', plane='YZ', reverse=False) #Deselect\n",
"\n",
"#Select by property\n",
"select.property(type='Area', name='ASEC1')\n",
"select.property(type='Cable', name='CAB1', reverse=True)\n",
"select.property(type='Frame', name='FSEC1')\n",
"select.property(type='Link', name='GAP1', reverse=True)\n",
"select.property(type='Material', name='A992Fy50')\n",
"select.property(type='Solid', name='SOLID1', reverse=True)\n",
"select.property(type='Tendon', name='TEN1')"
]
},
{
"cell_type": "markdown",
"metadata": {},
1 change: 1 addition & 0 deletions src/ak_sap/Select/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .main import Select
114 changes: 114 additions & 0 deletions src/ak_sap/Select/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
from typing import Literal

from ak_sap.utils import MasterClass, log
from ak_sap.utils.decorators import smooth_sap_do

class Select(MasterClass):
def __init__(self, mySapObject) -> None:
super().__init__(mySapObject=mySapObject)
self.__SelectObj = mySapObject.SapModel.SelectObj

@smooth_sap_do
def all(self) -> bool:
"""selects all objects in the model
"""
return self.__SelectObj.All(False)

@smooth_sap_do
def clear(self) -> bool:
"""Deselects all objects in model"""
return self.__SelectObj.ClearSelection()

@smooth_sap_do
def constraint(self, name: str, reverse: bool=False) -> bool:
"""selects or deselects all point objects to which the specified constraint has been assigned
Args:
name (str): name of an existing joint constraint
reverse (bool): deselect
"""
return self.__SelectObj.Constraint(name, reverse)

@property
def selected(self) -> list[dict]:
return selected_parse(ret=self.__SelectObj.GetSelected()), 0

@smooth_sap_do
def in_plane(self, pointname: str, plane: Literal['XY', 'YZ', 'XZ'], reverse: bool=False) -> bool:
"""selects or deselects all objects that are in the same plane as specified point object
Args:
pointname (str): point name
plane (Literal['XY', 'YZ', 'XZ']): plane to select
reverse (bool, optional): deselect. Defaults to False.
Raises:
Exception: If invalid plane option chosen
"""
match plane.casefold():
case 'xy':
return self.__SelectObj.PlaneXY(pointname, reverse)
case 'yz':
return self.__SelectObj.PlaneYZ(pointname, reverse)
case 'xz':
return self.__SelectObj.PlaneXZ(pointname, reverse)
case _:
raise Exception(f'{plane=} is not a valid choice.')

@smooth_sap_do
def invert(self) -> bool:
"""deselects all selected objects and selects all unselected objects
"""
return self.__SelectObj.InvertSelection()

@smooth_sap_do
def previous(self) -> bool:
"""restores the previous selection
"""
return self.__SelectObj.PreviousSelection()

@smooth_sap_do
def property(self,
type: Literal['Area', 'Cable', 'Frame', 'Link', 'Material', 'Solid', 'Tendon'],
name: str,
reverse: bool=False):
"""selects or deselects all objects to which the specified property has been assigned
Args:
type (Literal['Area', 'Cable', 'Frame', 'Link', 'Material', 'Solid', 'Tendon']): Property Type
name (str): Propertyname
reverse (bool, optional): Deselect. Defaults to False.
Raises:
Exception: If invalid type option chosen
"""
match type.casefold():
case 'area':
return self.__SelectObj.PropertyArea(name, )
case 'cable':
return self.__SelectObj.PropertyCable(name)
case 'frame':
return self.__SelectObj.PropertyFrame(name)
case 'link':
return self.__SelectObj.PropertyLink(name)
case 'material':
return self.__SelectObj.PropertyMaterial(name)
case 'solid':
return self.__SelectObj.PropertySolid(name)
case 'tendon':
return self.__SelectObj.PropertyTendon(name)
case _:
raise Exception(f'{type=} is not a valid choice.')

def selected_parse(ret: list) -> list[dict]:
assert ret[-1] == 0
selected: list[dict] = []

for idx in range(ret[0]):
selected.append(
{
'ObjectType': ['Point', 'Frame', 'Cable', 'Tendon', 'Area', 'Solid', 'Link'][ret[1][idx]-1],
'ObjectName': ret[2][idx]
}
)
return selected
2 changes: 2 additions & 0 deletions src/ak_sap/wrapper.py
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@
from ak_sap.Model import Model
from ak_sap.Object import Object
from ak_sap.Results import Results
from ak_sap.Select import Select
from ak_sap.utils.logger import log

class Sap2000Wrapper:
@@ -27,6 +28,7 @@ def __init__(self, attach_to_exist: bool = True, program_path: str|Path|None = N
self.Load = Load(mySapObject=self.mySapObject)
self.Results = Results(mySapObject=self.mySapObject)
self.Material = Material(mySapObject=self.mySapObject)
self.Select = Select(mySapObject=self.mySapObject)

log.info('Sap2000Wrapper Initialized')

18 changes: 18 additions & 0 deletions src/tests/Select/test_Select_main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from ak_sap.Select.main import selected_parse

def test_selected_parse():
ret = [0, (), (), 0]
assert selected_parse(ret) == []

ret = [3, (1, 1, 2), ('3', '5', '4'), 0]
assert selected_parse(ret) == [
{
'ObjectType': 'Point', 'ObjectName': '3'},
{
'ObjectType': 'Point', 'ObjectName': '5'},
{
'ObjectType': 'Frame', 'ObjectName': '4'}]

ret = [1, (1,), ('3',), 0]
assert selected_parse(ret) == [{'ObjectType': 'Point', 'ObjectName': '3'}]

0 comments on commit a5bb744

Please sign in to comment.