[CONNECT C++] Adding an AssociativePoint

In my DgnElementSetTool, I'm placing a cell at the projection of the cursor to the picked element. The cell gets placed, but the association is not correct - the cell has a dashed outline. What am I missing? I can successfully create a Dependency Linkage, but not an AssociativePoint....

private:	StatusInt _OnElementModify(EditElementHandleR eeh) override
{
	DgnButtonEvent			ev;
	GetCurrentDgnButtonEvent(ev);

	EditElementHandle		eehCell(m_masterCell, true);    // copy the original cell
	if (CreateSymbol(eehCell, ev))
	{ 
		AssocPoint			assocPoint;
		AssociativePoint::InitOrigin(assocPoint, 0);//0=default, 1-9= LL, UL, UR, LR, CL, UC, CR, LC, CC, can be used for element types: cell headers, shared cells, text nodes and text elements.
		if (AssociativePoint::IsValid(assocPoint, eeh.GetDgnModelP(), eehCell.GetDgnModelP()))
		{
			BentleyStatus		bStatus = AssociativePoint::SetRoot(assocPoint, eeh.GetElementId(), 0);
			StatusInt			iStatus = AssociativePoint::InsertPoint(eehCell, assocPoint, 0, 1);
			eehCell.AddToModel();
		}
    }
    return SUCCESS;
}

Parents
  • What am I missing?

    AssociativePoint::SetRoot(assocPoint, eeh.GetElementId(), 0);

    Check that the copy of the cell has a valid ID and DGN model.  I don't know the internal order of things, but you may have to add the cell copy to the model to obtain a valid ID and model reference, then do the associative stuff and finally rewrite the element.

     
    Regards, Jon Summers
    LA Solutions

  • If I add the copied cell (AddToModel()) prior to creating the AssociativePoint, and then use ReplaceInModel() after inserting the point into the cell, I get a return status of 32768, so something is still wrong. The placed cell gets no linkage. When do as described above, I at least get a linkage (an invalid one, but at least a linkage gets attached).

    A working example would be very helpful, as I have not been able to find one either in the Communities or the delivered examples.

    Bruce

  • A working example would be very helpful

    Does this thread help?

    This works for me, but I have an existing element …

    AssocPoint assocPoint;
    AssociativePoint::InitOrigin (assocPoint, 0);
    AssociativePoint::SetRoot (assocPoint, host.GetElementId (), 0, 0);
    TextHandlerBase::SetupOffsetAssociation (label, host, assocPoint);
    

     
    Regards, Jon Summers
    LA Solutions

  • Thanks, but your example doesn't directly apply - I'm trying to associate a cell origin to a location on an element. I've got an existing element picked by the user, that is passed into _OnElementModify(). The cell element is "in memory" (dynamically), displayed with it's origin aligned to the cursor location, and has not yet been added to the model. The _OnElementModify() function does the following:

    AssociativePoint::InitOrigin(assocPoint, 0);//0=default, 1-9= LL, UL, UR, LR, CL, UC, CR, LC, CC, can be used for element types: cell headers, shared cells, text nodes and text elements.
    BentleyStatus		bStatus = AssociativePoint::SetRoot(assocPoint, eeh.GetElementId(), 0, 0);
    StatusInt			iStatus = AssociativePoint::InsertPoint(eehCell, assocPoint, 0, 1);
    eehCell.AddToModel();
    

    which places the cell into the model, and creates an "invalid" Association. If I alter the code slightly:

    eehCell.AddToModel();
    AssociativePoint::InitOrigin(assocPoint, 0);//0=default, 1-9= LL, UL, UR, LR, CL, UC, CR, LC, CC, can be used for element types: cell headers, shared cells, text nodes and text elements.
    BentleyStatus		bStatus = AssociativePoint::SetRoot(assocPoint, eeh.GetElementId(), 0, 0);
    StatusInt			iStatus = AssociativePoint::InsertPoint(eehCell, assocPoint, 0, 1);
    eehCell.ReplaceInModel(eehCell.GetElementRef());

    the cell places in the model, but no Association Linkage is created. Still not sure what I'm missing. I did find an earlier thread (+5 yrs ago) in which Brien Bastings suggested using mdlAssoc_getPoint() and use that position to "move" the cell (again) prior to calling ReplaceInModel(). That didn't work either.

    Bruce

Reply
  • Thanks, but your example doesn't directly apply - I'm trying to associate a cell origin to a location on an element. I've got an existing element picked by the user, that is passed into _OnElementModify(). The cell element is "in memory" (dynamically), displayed with it's origin aligned to the cursor location, and has not yet been added to the model. The _OnElementModify() function does the following:

    AssociativePoint::InitOrigin(assocPoint, 0);//0=default, 1-9= LL, UL, UR, LR, CL, UC, CR, LC, CC, can be used for element types: cell headers, shared cells, text nodes and text elements.
    BentleyStatus		bStatus = AssociativePoint::SetRoot(assocPoint, eeh.GetElementId(), 0, 0);
    StatusInt			iStatus = AssociativePoint::InsertPoint(eehCell, assocPoint, 0, 1);
    eehCell.AddToModel();
    

    which places the cell into the model, and creates an "invalid" Association. If I alter the code slightly:

    eehCell.AddToModel();
    AssociativePoint::InitOrigin(assocPoint, 0);//0=default, 1-9= LL, UL, UR, LR, CL, UC, CR, LC, CC, can be used for element types: cell headers, shared cells, text nodes and text elements.
    BentleyStatus		bStatus = AssociativePoint::SetRoot(assocPoint, eeh.GetElementId(), 0, 0);
    StatusInt			iStatus = AssociativePoint::InsertPoint(eehCell, assocPoint, 0, 1);
    eehCell.ReplaceInModel(eehCell.GetElementRef());

    the cell places in the model, but no Association Linkage is created. Still not sure what I'm missing. I did find an earlier thread (+5 yrs ago) in which Brien Bastings suggested using mdlAssoc_getPoint() and use that position to "move" the cell (again) prior to calling ReplaceInModel(). That didn't work either.

    Bruce

Children