Skip to content

Commit

Permalink
add get_elements_by_projects get_element_by_category
Browse files Browse the repository at this point in the history
  • Loading branch information
chuongmep committed Sep 10, 2024
1 parent d5e965d commit 1318d66
Show file tree
Hide file tree
Showing 2 changed files with 179 additions and 35 deletions.
158 changes: 158 additions & 0 deletions APSToolkitPython/src/aps_toolkit/AECDataModel.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,3 +155,161 @@ def get_element_group_by_project(self, projectId: str) -> pd.DataFrame:
result = self.execute_query_variables(data['query'], data['variables'])
item_versions = result['data']['elementGroupsByProject']['results']
return pd.json_normalize(item_versions)

def get_element_by_category(self, elementGroupId: str, category: str) -> pd.DataFrame:
data = {
"query": """
query GetElementsFromCategory($elementGroupId: ID!, $propertyFilter: String!) {
elementsByElementGroup(elementGroupId: $elementGroupId, filter: {query:$propertyFilter}) {
pagination {
cursor
}
results {
id
name
properties(includeReferencesProperties: "Type") {
results {
name
value
definition {
units{
name
}
}
}
}
}
}
}
""",
"variables": {
"elementGroupId": elementGroupId,
"propertyFilter": f"'property.name.category'=={category} and 'property.name.Element Context'==Instance"
}
}
result = self.execute_query_variables(data['query'], data['variables'])
elements = result['data']['elementsByElementGroup']['results']
df = pd.json_normalize(elements)
data_df = pd.DataFrame()
for i, row in df.iterrows():
props_dict = {}
single_df = pd.json_normalize(row['properties.results'])
for i in range(len(single_df)):
props_dict[single_df['name'][i]] = single_df['value'][i]
single_df = pd.DataFrame(props_dict, index=[0], dtype="object")
data_df = pd.concat([data_df, single_df], axis=0)
return data_df

def get_element_projects_by_parameters(self, projectId: str, parameters: list[str]) -> pd.DataFrame:
parameters_str = '","'.join(parameters)
query = f"""
query GetElementsInProject($projectId: ID!, $propertyFilter: String!) {{
elementsByProject(projectId: $projectId, filter: {{query: $propertyFilter}}) {{
pagination {{
cursor
}}
results {{
id
name
properties(
includeReferencesProperties: "Type"
filter: {{names: ["{parameters_str}"]}} # Dynamically insert parameters here
) {{
results {{
name
value
displayValue
definition {{
units {{
name
}}
}}
}}
}}
}}
}}
}}
"""

data = {
"query": query,
"variables": {
"projectId": projectId,
"propertyFilter": "'property.name.Element Context'==Instance"
}
}

# Execute the query
result = self.execute_query_variables(data['query'], data['variables'])

# Normalize the data into a pandas DataFrame
elements = result['data']['elementsByProject']['results']
df = pd.json_normalize(elements)

data_df = pd.DataFrame()
for i, row in df.iterrows():
props_dict = {}
single_df = pd.json_normalize(row['properties.results'])
for i in range(len(single_df)):
props_dict[single_df['name'][i]] = single_df['value'][i]
single_df = pd.DataFrame(props_dict, index=[0], dtype="object")
data_df = pd.concat([data_df, single_df], axis=0)

return data_df

def get_elements_by_projects(self, projectId: str, cursor: str = None) -> pd.DataFrame:
# Define the GraphQL query with the cursor as a dynamic variable
data = {
"query": """
query GetElementsInProject($projectId: ID!, $propertyFilter: String!, $cursor: String) {
elementsByProject(projectId: $projectId, filter: {query: $propertyFilter}, pagination: {cursor: $cursor}) {
pagination {
cursor
}
results {
id
name
properties(
includeReferencesProperties: "Type"
) {
results {
name
value
displayValue
definition {
units {
name
}
}
}
}
}
}
}
""",
"variables": {
"projectId": projectId,
"propertyFilter": "'property.name.Element Context'==Instance",
"cursor": cursor
}
}

# Execute the query
result = self.execute_query_variables(data['query'], data['variables'])

# Process the results into a pandas DataFrame
elements = result['data']['elementsByProject']['results']
df = pd.json_normalize(elements)

data_df = pd.DataFrame()
for i, row in df.iterrows():
props_dict = {}
single_df = pd.json_normalize(row['properties.results'])
for i in range(len(single_df)):
props_dict[single_df['name'][i]] = single_df['value'][i]
single_df = pd.DataFrame(props_dict, index=[0], dtype="object")
data_df = pd.concat([data_df, single_df], axis=0)

return data_df

56 changes: 21 additions & 35 deletions APSToolkitPython/src/test/test_aec_data_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,27 @@ def test_get_element_group_by_project(self):
result = self.aec_data_model.get_element_group_by_project(self.project_id)
self.assertIsNotNone(result)

def test_get_element_by_category(self):
result = self.aec_data_model.get_element_by_category(self.group_id, "Doors")
self.assertIsNotNone(result)

def test_get_element_projects_by_parameters(self):
result = self.aec_data_model.get_element_projects_by_parameters(self.project_id,
["Name", "Revit Element ID", "Category",
"Width", "Height", "Element Context",
"Family Name", "Type Name", "Comments"])
self.assertIsNotNone(result)

def test_get_element_projects_by_parameters2(self):
result = self.aec_data_model.get_element_projects_by_parameters2(self.project_id)
self.assertIsNotNone(result)

def test_get_element_projects_by_parameters3(self):
cursor = "YWRjdXJzfjB-NTB-NTA"
# cursor = ""
result = self.aec_data_model.get_elements_by_projects(self.project_id, cursor)
self.assertIsNotNone(result)

def test_version_group_by_project(self):
query = """
query GetElementGroupsByProject($projectId: ID!) {
Expand All @@ -59,41 +80,6 @@ def test_version_group_by_project(self):
result = self.aec_data_model.execute_query_variables(query, variables)
self.assertIsNotNone(result)

def test_get_element_by_category(self):
query = """
query GetElementsFromCategory($elementGroupId: ID!, $propertyFilter: String!) {
elementsByElementGroup(elementGroupId: $elementGroupId, filter: {query:$propertyFilter}) {
pagination {
cursor
}
results {
id
name
properties {
results {
name
value
definition {
name
units {
id
name
}
}
}
}
}
}
}
"""
variables = {
"elementGroupId": f"{self.group_id}", # Replace with your actual element group ID
"propertyFilter": "property.name.category==Walls"
# Replace with your property filter property.name.category==Walls
}
result = self.aec_data_model.execute_query_variables(query, variables)
self.assertIsNotNone(result)

def test_get_elements_from_type(self):
query = """
query ($elementGroupId: ID!, $propertyFilter: String!) {
Expand Down

0 comments on commit 1318d66

Please sign in to comment.