Mastering Chain Selection on CAD Geometry with Inspire Python API

Karthi Kandasamy
Karthi Kandasamy
Altair Employee
edited August 24 in Altair HyperWorks

Working with a Complex Part

Imagine you are designing an aerodynamic component, such as a car spoiler, in a CAD system. The spoiler's shape is critical to its performance, and its surface must be smooth to minimize drag. The spoiler might be composed of several planar and curved surfaces that need to be analyzed and refined together.

  • Step 1: Picking a Feature

    • Using pickFeature(), you can interactively select a face on the spoiler. This selection might be the main surface that faces the airflow.
  • Step 2: Analyzing Connected Faces

    • With getConnectedFaces(face, breakAngle=45), you can automatically identify all faces connected to the selected face that maintain a smooth transition (within 45 degrees of angular difference). This is useful for ensuring that the entire surface works together aerodynamically.
    • The function's ability to yield connected faces makes it easy to iterate over them, allowing for batch operations, such as smoothing, checking for continuity.
  • Step 3: Highlighting and Refining

    • The inspire.highlight() function can be used to visually highlight all connected faces in the CAD interface. This immediate visual feedback helps the designer understand the relationship between different surfaces.
    • If some surfaces are not highlighted (perhaps due to exceeding the break angle), the designer might decide to manually adjust those surfaces to ensure better continuity, improving the overall aerodynamic performance of the part.

Place the sample code provided below into your Inspire Python console and give it a try. 

from hwx import inspire import math from collections import deque from hwx.inspire.gui.debug import pickFeature  def getNormal(ft):     """     Returns the normal vector of a given feature.      Args:         ft: The feature whose normal vector is needed. It is expected to be an instance               of `inspire.FeaturePlanar`.          Returns:         A normal vector if the feature is planar.         Otherwise, attempts to compute the normal using the `getNormal` method          with `ft.cg`.     """     if isinstance(ft, inspire.FeaturePlanar):         return ft.normal     else:         # Attempt to compute normal for non-planar features.         return ft.getNormal(ft.cg)  def getConnectedFaces(face, breakAngle=45):     """     Finds and yields all faces connected to the given face that have a normal within     the specified break angle.      Args:         face: The initial face to start the search from.         breakAngle (float, optional): The maximum angle difference (in degrees) between          the normals of connected faces. Defaults to 45 degrees.      Yields:         Connected faces within the specified normal angle difference.     """     dp = math.cos(math.radians(breakAngle)) - 1e-6      # Set to track processed faces     seen = {face}     # Queue for BFS (Breadth-First Search)     q = deque(seen)      while True:         try:             face = q.pop()         except IndexError:             return  # Exit loop when no more faces to process                  normal = getNormal(face)                  for edge in face.connectedCurves:             for neighbor in edge.connectedFaces:                 if neighbor in seen:                     continue                 if getNormal(neighbor) % normal < dp:                     continue                                  seen.add(neighbor)                 yield neighbor                 q.append(neighbor)  # Example Usage face = pickFeature()  # Allows user to pick a face interactively  # Highlights all connected faces in Orange inspire.highlight(getConnectedFaces(face), color='Orange')   

Improving Workflow Efficiency

The code provided is a prime example of how automation and scripting can significantly enhance the efficiency of CAD workflows:

  • Automation of Repetitive Tasks: Identifying connected faces manually in a complex model could be tedious and error-prone. The provided script automates this task, reducing the time and effort required.
  • Error Reduction: By relying on precise geometric calculations (e.g., using normals and angles), the script minimizes the risk of human error, ensuring that only correctly connected faces are selected for further operations.
  • Customizability: The script can be adapted to various design scenarios by adjusting parameters like breakAngle, making it a versatile tool for different types of models and design requirements.

Extending the Code for Advanced Applications

The script serves as a foundation for more advanced tools in a CAD environment:

  • Integration with Simulation Tools: By identifying connected faces, the script could be integrated with simulation tools to automatically apply boundary conditions, loads, or materials to entire regions of a model.

Overall, this approach to automating geometric analysis and feature selection is a valuable asset in the CAD world, enabling designers to create better products in less time.

Happy scripting!

 

Comments

  • FranciscoRamirez
    FranciscoRamirez Altair Community Member
    edited September 11

    Are these commands available in Simlab?

  • Santhoshkumar
    Santhoshkumar
    Altair Employee
    edited September 12

    Are these commands available in Simlab?

    Yes, SimLab has a tool "Select Adjacent Layers" which will select the connected faces from the given input face based on the break angle. This function is available in Python. Please refer the attached video.

     

  • FranciscoRamirez
    FranciscoRamirez Altair Community Member
    edited September 12

    Are these commands available in Simlab?

    Yes, SimLab has a tool "Select Adjacent Layers" which will select the connected faces from the given input face based on the break angle. This function is available in Python. Please refer the attached video.

     

    Nice explanation, although it seems that the code used in Inspire in simpler and easier to understand.