mdlElement_getEffectiveSymbology读取颜色问题

符老师、郭老师好:
我尝试了用    mdlElement_getEffectiveSymbology来获取某个元素的最终颜色,不过看数据输出还是不正确的样子
UInt32              ColorOut= 0xffffffff;
    UInt32              WeightOut = 0;
    Int32               StyleOut = 0;
    UInt32              FillColorOut = 0;
    LineStyleParams         StyleParamOut = {};
    StyleParamOut.Init();
    mdlElement_getEffectiveSymbology(&ColorOut,&WeightOut,&StyleOut,&StyleParamOut,&FillColorOut,
    m_hElement.GetElementCP(),m_hElement.GetModelRef(),NULL,tcb->lstvw);
打印ColorOut的数值,大多数都是0,偶尔是9、18这种很小的数字。
截图中显示这一片拱形区域的颜色是青色,还是没有读取到,是我还有哪里使用方式不对?
Parents
  • 该函数返回的颜色叫做elementColor,即当前模型中颜色表(ColorTable)中的索引值。如果需要RGB色的话,还需要调用函数mdlColor_elementColorToRGB。如下代码能正确取得共享单元的颜色。

    void getEffetiveColorTest()
    {
    	UInt32    clr;
    	MSElement el;
    	mdlAssoc_getElement(&el, NULL, 45352L, ACTIVEMODEL);
    	mdlElement_getEffectiveSymbology(&clr, NULL, NULL, NULL, NULL, &el, ACTIVEMODEL, NULL, tcb->lstvw);
    
    	byte rgb[3];
    	mdlColor_elementColorToRGB(rgb, NULL, ACTIVEMODEL, clr, NULL);
    	WPrintfString wStr(L"elementColor=%d, red=%d, green=%d, blue=%d", clr, rgb[0], rgb[1], rgb[2]);
    	mdlDialog_dmsgsPrint(wStr);
    }

    下图Messages对话框中的输出的第一行是我没有修改颜色时的情况,后来手工改为红色后,输出为第二行。



  • 这种处理方式能处理所有的情况吗?比如会不会有没有颜色表情况,比如之前说的DisplayRule,DisplayStyle,ByLevel都能统一用这种方法来处理吗?

  • 这种处理方式能处理所有的情况吗?比如会不会有没有颜色表情况,比如之前说的DisplayRule,DisplayStyle,ByLevel都能统一用这种方法来处理吗?

    我测试了一下,如果不是用的颜色表中的颜色通过符老师的方法也可以获取到颜色。

    用户一般不会查看线框模式,当我选择ID45352元素时,箭头所指时青色,模型那个面片也时青色,为什么读取的数值时白色呢?

    单元最好是迭代一下子元素去获取一下颜色属性,可以用ChildEditElemIter去迭代,SDK的文档里边有注释如何使用:

  • 我现在遍历模型子元素的方式是这样的:

            ScanCriteriaP  pSC = mdlScanCriteria_create();
            mdlScanCriteria_setModel(pSC, modelRef);
            mdlScanCriteria_setModelSections(pSC, DgnModelSections::GraphicElements);
            mdlScanCriteria_setDrawnElements(pSC);
            BitMaskCP lvlMask = modelRef->GetEffectiveLevelDisplayMask();  //unpublished function, should overwrite DgnModelRef.h file
            mdlScanCriteria_setConstLevelTest(pSC, lvlMask, true);
            mdlScanCriteria_setReturnType(pSC, MSSCANCRIT_RETURN_FILEPOS, FALSE, FALSE);

            
            int              scanWords = 0;
            int              numAddr = 0;
            int             status = 0;
            UInt32           elemAddr[500= {}, filePos = 0;

            do
            {
                scanWords = sizeof(elemAddr) / sizeof(short);
                status = mdlScanCriteria_scan(pSC, elemAddr, &scanWords, &filePos);
                numAddr = scanWords / sizeof(short);
                for (int i = 0; i < numAddr; i++)
                {
                    MSElementDescrP edP = NULL;
                    mdlElmdscr_readToMaster(&edP, elemAddr[i], modelRef, FALSE, NULL);
                    if (edP->el.hdr.dhdr.props.b.invisible)    //skip invisible element
                        continue;
                    
                    ElementHandle eh(edP, true);
    .........................
                }
             }
    单元最好是迭代一下子元素去获取一下颜色属性,用ChildEditElemIter的化,是不是要要找到根节点然后进行树形遍历?然后不需要用我上面的循环来遍历了?
    如果是这样,我搜了一下,没找到如何获取根元素的接口,不知道有没有示例。
    如果不是这样,那就是在我上面循环获取的每个元素再去递归获取子元素,这些获取到的子元素是否也会在外面循环的时候被遍历到?如果会被遍历到,那这两种方式获取的元素接口再获取颜色就能获取到正确的了是吧?
    如果不能被遍历到,那就说明我原来的这个循环遍历方法有漏掉了很多元素是不?
     
  • 您上边的代码是遍历Model下的元素,Model下的元素分简单元素和复杂元素,复杂元素由简单元素或者复杂元素组合起来加一个复杂元素头构成的,如果是复杂元素的话,上边的代码只会获取到这个复杂头元素,处理这个复杂头元素的时候,用我说的方法去迭代一下复杂元素的所有子元素。您原来的方法如果指的是用IElementGraphicsProcessor导出几何数据的话,这个接口后台已经对复杂元素处理好了,不会漏掉子元素的几何数据。

Reply
  • 您上边的代码是遍历Model下的元素,Model下的元素分简单元素和复杂元素,复杂元素由简单元素或者复杂元素组合起来加一个复杂元素头构成的,如果是复杂元素的话,上边的代码只会获取到这个复杂头元素,处理这个复杂头元素的时候,用我说的方法去迭代一下复杂元素的所有子元素。您原来的方法如果指的是用IElementGraphicsProcessor导出几何数据的话,这个接口后台已经对复杂元素处理好了,不会漏掉子元素的几何数据。

Children
No Data