MSCE C++ 关于ParametericSolid创建的几点疑问

各位老师好,

在学习"\exampleSolids\exampleParametricFeatureTree.cpp"时,尝试这写一个关于booleanUnion的例子,虽然创建成功,但是有几个问题请老师们解答一下。

EditElementHandle _cushionCapEeh, _squarePileEeh; // Two defined smartsolid EidtElementHandle
	TrapezoidCushionCap _cushioCap(1, 1.5, 0.5, 1);
	SquarePile _squarePile(10, 1);
	if (SUCCESS != _cushioCap.Create(_cushionCapEeh, *ACTIVEMODEL) || SUCCESS != _squarePile.Create(_squarePileEeh, *ACTIVEMODEL)) {
		mdlDialog_dmsgsPrint(L"Cant't create cushion cap or square pile");
		return;
	}
	_cushionCapEeh.AddToModel();
	_squarePileEeh.AddToModel();
    //Question #1
    
	T_ChildElementToControlFlagsMap _childElementToControlFlagsMap;
	T_ControlFlagsVector _controlFlags(3, false); 
	_childElementToControlFlagsMap[_cushionCapEeh.GetElementRef()] = _controlFlags;
	_childElementToControlFlagsMap[_squarePileEeh.GetElementRef()] = _controlFlags;
	
	EditElementHandle _unionEeh;
	SmartFeatureNodePtr _unioNode;
	if (SUCCESS != FeatureCreate::CreateUnionFeature(_unioNode)) return;


	if (SUCCESS != SmartFeatureElement::CreateAndWriteSmartFeatureElement(_unionEeh, _squarePileEeh, _squarePileEeh.GetDgnModelP(), *_unioNode, _childElementToControlFlagsMap,true))
	{
		mdlDialog_dmsgsPrint(L"Can't create smart Feature!");
		return;
	}
	//Question #2
	//_unionEeh.AddToModel();
	//Question #3

Question #1: 在创建ParametericSolid的时候,为什么必须先把SmartSolid形体加入模型中才可创建?若不加入,则会提示形体无法创建.

Question #2: 在CreateAndWriteSmartFeatureElement中传出的第一个参数代表的EditElementHandle和上面两个被合并的EditElementHandle是什么关系?此时的_unionEeh可以加入模型,同时创建出新的ExtendedElement类型的元素,但并没有显示相关节点。

Question #3:如果在创建ParametericSolid后想要进行空间坐标变换,通过调用_unioNode.TransformFeatureAndDependents和_unionEeh.ApplyTransform均不成功,应如何进行?

  • Mstn里边的约束是通过元素依赖机制来实现模型在发生变化时自动更新整个系统的,往元素上添加依赖时这个元素得是dgn文件的元素才可以,您可以在SDK文档里边搜一下有介绍元素依赖相关内容的。SmartFeatureElement::CreateAndWriteSmartFeatureElement函数调用返回的第一个参数,这个元素在函数调用时已经被添加到dgn文件中了,您可以试试在这个函数返回后获取一下这个参数的ID值(只有在dgn文件中存在的元素才有ID值),是存在的。这个元素可以理解类似于一个单元头元素,所以你再次调用AddToModel添加到模型中,就会出现多了一个ExtendedElement元素,实际这个就是参数化实体的头元素。对参数化实体进行变换,好像是您说的情况,我再测试测试再回复您。

  • 对参数化实体进行旋转移动变换需要对每个组成参数化实体的成员元素进行变换,如下代码所示:

    EditElementHandle _cushionCapEeh, _squarePileEeh; // Two defined smartsolid EidtElementHandle 
    	DPoint3d baseOrigin = { 0 };
    	DPoint3d topOrigin = { 0,0,10000 };
    	DVec3d vectorX = DVec3d::From(1, 0, 0);
    	DVec3d vectorY = DVec3d::From(0, 1, 0);
    	double baseX = 10000;
    	double baseY = 10000;
    	double topX = 10000;
    	double topY = 10000;
    	bool capped = true;
    	DgnBoxDetail dgnBoxDeta(baseOrigin, topOrigin, vectorX, vectorY, baseX, baseY, topX, topY, capped);
    	ISolidPrimitivePtr iSolidPri = ISolidPrimitive::CreateDgnBox(dgnBoxDeta);
    	DraftingElementSchema::ToElement(_cushionCapEeh, *iSolidPri, NULL, *ACTIVEMODEL);
    	baseOrigin = { 5000,0,0 };
    	topOrigin = { 5000,0,10000 };
    	DgnBoxDetail dgnBoxDetaB(baseOrigin, topOrigin, vectorX, vectorY, baseX, baseY, topX, topY, capped);
    	iSolidPri = ISolidPrimitive::CreateDgnBox(dgnBoxDetaB);
    	DraftingElementSchema::ToElement(_squarePileEeh, *iSolidPri, NULL, *ACTIVEMODEL);
    
    	_cushionCapEeh.AddToModel();
    	_squarePileEeh.AddToModel();
    	//Question #1
    
    	T_ChildElementToControlFlagsMap _childElementToControlFlagsMap;
    	T_ControlFlagsVector _controlFlags(3, false);
    	_childElementToControlFlagsMap[_cushionCapEeh.GetElementRef()] = _controlFlags;
    	_childElementToControlFlagsMap[_squarePileEeh.GetElementRef()] = _controlFlags;
    
    	EditElementHandle _unionEeh;
    	SmartFeatureNodePtr _unioNode;
    	if (SUCCESS != FeatureCreate::CreateUnionFeature(_unioNode)) return;
    
    
    	if (SUCCESS != SmartFeatureElement::CreateAndWriteSmartFeatureElement(_unionEeh, _squarePileEeh, _squarePileEeh.GetDgnModelP(), *_unioNode, _childElementToControlFlagsMap, true))
    	{
    		mdlDialog_dmsgsPrint(L"Can't create smart Feature!");
    		return;
    	}
    	DPoint3d ptTran = { 50000,0,0 };
    	RotMatrix matrix = RotMatrix::FromIdentity(); 
    	Transform tran = Transform::From(matrix, ptTran);
    	TransformInfo transform(tran);
    	if (SUCCESS == _cushionCapEeh.GetHandler().ApplyTransform(_cushionCapEeh, transform))
    	{
    		_cushionCapEeh.GetElementP()->hdr.dhdr.props.b.invisible = 1;
    		_cushionCapEeh.ReplaceInModel(_cushionCapEeh.GetElementRef());
    	}
    	if (SUCCESS == _squarePileEeh.GetHandler().ApplyTransform(_squarePileEeh, transform))
    	{
    
    		_squarePileEeh.GetElementP()->hdr.dhdr.props.b.invisible = 1;
    		_squarePileEeh.ReplaceInModel(_squarePileEeh.GetElementRef());
    	}
    	mdlDependency_processAffected(); 

    Answer Verified By: DawsenSu 

  • 感谢郭老师,

    还有一个问题,如果想要在这个合并parametericSolid上附加ec应该怎么操作?

  • 直接在_unionEeh上加就行了,您试试。

    Answer Verified By: DawsenSu