PMI annotations reading (TDF_Label.FindAttribute from OCP not working properly)

Open
#153 3 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
35/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Stale
Tech stack
cpp, python

Research direction

Start by running the attached TestOCCT.cpp project with the supplied STEP file and compare its C++ attribute lookup with the Python TDF_Label.FindAttribute call. Inspect the XCAFDoc_Dimension and FindAttribute entry points; done means identifying the binding mismatch or a reliable workaround and documenting the corrected PMI-reading behavior.

Written by the indexing model from the issue text.

Description

Hello,

I'm trying to implement the reading of PMI annotations (Geometrical Dimensions and tolerances) from a step file using OCP.

I have a C++ code that is working fine and that I have already tested:
annotations

In my C++ code, I have something like this:


m_gdtTool = XCAFDoc_DocumentTool::DimTolTool(doc->Main());

TDF_LabelSequence labels_datums, label_geoms, label_dims, label_dimTols;
m_gdtTool->GetDatumLabels(labels_datums);
m_gdtTool->GetDimensionLabels(label_dims);
m_gdtTool->GetGeomToleranceLabels(label_geoms);

int datumSize = labels_datums.Length();
int dimSize = label_dims.Length();
int geomSize = label_geoms.Length();
// Dimensional Tolerances
for (int i = 1; i <= dimSize; ++i)
{
    const TDF_Label& label_dim = label_dims.Value(i);
    Handle(XCAFDoc_Dimension) aDimAttr;
    label_dim.FindAttribute(XCAFDoc_Dimension::GetID(), aDimAttr);

    if (!aDimAttr.IsNull())
    {
        Handle(XCAFDimTolObjects_DimensionObject) aDimObject = aDimAttr->GetObject();
    }
}

So, I have translated into python:

        labels_datums = TDF_LabelSequence()
        labels_dims = TDF_LabelSequence()
        labels_geoms = TDF_LabelSequence()

        self.gdt_tool.GetDatumLabels(labels_datums)
        self.gdt_tool.GetDimensionLabels(labels_dims)
        self.gdt_tool.GetGeomToleranceLabels(labels_geoms)

        datum_size = labels_datums.Length()
        dim_size = labels_dims.Length()
        geom_size = labels_geoms.Length()
         for i in range(1, dim_size + 1):
            label_dim = labels_dims.Value(i)
            aDimAttr = XCAFDoc_Dimension()
            found = label_dim.FindAttribute(XCAFDoc_Dimension.GetID_s(), aDimAttr)

            if found:
                aDimObject = aDimAttr.GetObject()

When the execution gets in the line aDimObject = aDimAttr.GetObject() I get this error:

image

I have verified and compared the label_dim variable in both python and c++ :

python

image

c++

image

Do you have any ideas why I'm getting this error?

I suspect that the problem is coming from TDF_Label.FindAttribute method:

I think that for my case it's falling in the third case, and maybe the pybind11 wrapping of this method is not working properly because the generic type?
image

I'm attaching the c++ project and the step file used to test the reading. The main file is called TestOCCT.cpp

Thank you very much for the attention. Any insight on how to solve this issue or workaround will be highly appreciated!
TestOCCPMI.zip

Dominant language
C++
Stars
200
Forks
48
Avg merge
1d 13h
Merged PRs (30d)
4

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from CadQuery/OCP

All issues in CadQuery/OCP

Similar issues

More C++ issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.