找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: 18255190954

[原创] 模型着色&&装配体一键自动着色

[复制链接]

8

主题

53

回帖

0

威望

助工

积分
73
 楼主| 发表于 2018-11-19 14:53 | 显示全部楼层
if(type==PRO_MDL_ASSEMBLY)
               {
                           status=ProSolidFeatVisit((ProSolid)model,(ProFeatureVisitAction)FeatureAsmVisitAcFn1,FeatFilterAction11,(CArray<roFeature,ProFeature>*)&feat_list);
                           int num=(int)feat_list.GetCount();//一级遍历下总元件数
                           for (int i=0;i<num;i++)
             {
                              ProSolid mdl;
                              status=ProAsmcompMdlGet((ProAsmcomp *)(&feat_list[i]),(ProMdl *)&mdl);
                                  status = ProMdlToModelitem(mdl,&modelitem);
                  status=ProMdlTypeGet(mdl,&type1);//一级零部件特征类型
                                  status= ProSurfaceAppearancepropsGet(&modelitem,&proprop1);//获得零件表面属性
                                  ProSurfaceAppearanceProps proprop={0.8,0.8,0.7,0.6,0.0,{Color[j],Color[j+1],Color[j+2]},{0,0,1},proprop1.reflection,*proprop1.name,*proprop1.label,*proprop1.description,*proprop1.keywords};
                                 
                                  if(i>0&&i%7==0)//七种颜色循环遍历使用
                                          j=0;
                                  else
                                  {
                             j=j+3;
                                  }
                                  status= ProSurfaceAppearancepropsSet(&modelitem,&proprop);//设置零部件表,面属性
                         }
                   }

以上是核心代码,想做的按照遍历,设置参数,着色的思路就行,这个功能不难
回复

使用道具 举报

0

主题

130

回帖

2

威望

助工

积分
161
QQ
发表于 2018-11-19 14:54 | 显示全部楼层
   讲解下教程呗
回复

使用道具 举报

8

主题

53

回帖

0

威望

助工

积分
73
 楼主| 发表于 2018-11-19 14:55 | 显示全部楼层
罗阳91 发表于 2018-11-19 14:52
功能不错,就是没找到……

这是自己开发的,系统的没有自动着色,只能一个个着色,核心代码已经贴出来了
回复

使用道具 举报

8

主题

53

回帖

0

威望

助工

积分
73
 楼主| 发表于 2018-11-19 14:56 | 显示全部楼层

按照 遍历装配体零部件,然后给ProSurfaceAppearancepropsSet这个函数设置参数,运行就可以着色了,没什么内容
回复

使用道具 举报

7

主题

229

回帖

9

威望

工程师

积分
297
发表于 2018-11-20 08:22 | 显示全部楼层
谢谢分享,但你给这个这个代码就想让大家都会这个?你不整个详细说明,这里95%的人都不会。。。
回复

使用道具 举报

8

主题

53

回帖

0

威望

助工

积分
73
 楼主| 发表于 2018-11-20 09:07 | 显示全部楼层
void ColorSelect::OnBnClickedButton1()
{
        // TODO: 在此添加控件通知处理程序代码
        ProError status;
        int n_sel;
        ProMdl model;
        ProMdlType        type,type1;
        ProSelection *sel;
        ProModelitem modelitem;
        COLORREF color=RGB(255,0,0);
        CColorDialog colorDlg(color);
        CArray<ProFeature,ProFeature> feat_list;
        status=ProMdlCurrentGet(&model);//获得当前模型
        ProSurfaceAppearanceProps proprop;
        ProSurfaceAppearanceProps proprop1;
        ProName name;
        int i;
        int j=0;
        double rands;
        char str[60],str1[60],str2[60],str3[60];
        double Color[30];
    //产生随机数(0-1)一共产生24个
        srand(time(0));
    for (int i = 0; i < 24; i++)
        {
      rands=(rand() % 10) * 0.1;
          Color[i]=rands;
        }
        //int a[30]={1,0,0,1,1,0,1,1,1,1,0,1,0,1,0,0,0,1,0,1,1,0,1,1};
        UpdateData(TRUE);//更新编辑框和单选按钮值
       
        if(m_danxuan==8&&m_danxuan1==0)
          {
                  if (IDOK==colorDlg.DoModal());//调用系统颜色选择框
            {
               color=colorDlg.GetColor();
                   status = ProSelect("part", -1, NULL,NULL, NULL, NULL, &sel, &n_sel);//选择零部件
               if(n_sel==0)
                   return ;
                      for(i=0;i<n_sel;i++)
                   {
                      status = ProSelectionModelitemGet(sel[i],&modelitem);
                        ProMdlNameGet(modelitem.owner,name);
                      ProWstringToString (str, name);
                      status= ProSurfaceAppearancepropsGet(&modelitem,&proprop1);//获得零件表面属性
                     /* ProWstringToString(str,proprop1.name);
                      ProWstringToString(str1,proprop1.label);
                      ProWstringToString(str2,proprop1.description);
                      ProWstringToString(str3,proprop1.keywords);*/
                  ProSurfaceAppearanceProps proprop={0.5,0.5,0.5,0.5,0.0,{GetRValue(color)/255.0,GetGValue(color)/255.0,GetBValue(color)/255.0},{0,0,1},proprop1.reflection,*proprop1.name,*proprop1.label,*proprop1.description,*proprop1.keywords};
                      status= ProSurfaceAppearancepropsSet(&modelitem,&proprop);//设置零部件表,面属性
                   }
            }
          }
        else
                if(m_danxuan==0&&m_danxuan1==0)
                {
                   status = ProSelect("part", -1, NULL,NULL, NULL, NULL, &sel, &n_sel);//选择零部件
               if(n_sel==0)
                   return ;
                     for(i=0;i<n_sel;i++)
                  {
                      status = ProSelectionModelitemGet(sel[i],&modelitem);
                      status= ProSurfaceAppearancepropsGet(&modelitem,&proprop1);//获得零件表面属性
                      ProSurfaceAppearanceProps proprop={0.5,0.5,0.5,0.5,0.0,{0,0,0},{0,0,1},proprop1.reflection,*proprop1.name,*proprop1.label,*proprop1.description,*proprop1.keywords};
                      status= ProSurfaceAppearancepropsSet(&modelitem,&proprop);//设置零部件表,面属性
                  }
                }
        else
                if(m_danxuan==1&&m_danxuan1==0)
                {
                         
                     status = ProSelect("part", -1, NULL,NULL, NULL, NULL, &sel, &n_sel);//选择零部件
                 if(n_sel==0)
                     return ;
                         for(i=0;i<n_sel;i++)
                  {
                     status = ProSelectionModelitemGet(sel[i],&modelitem);
                     status= ProSurfaceAppearancepropsGet(&modelitem,&proprop1);//获得零件表面属性
                     ProSurfaceAppearanceProps proprop={0.5,0.5,0.5,0.5,0.0,{1,0,0},{0,0,1},proprop1.reflection,*proprop1.name,*proprop1.label,*proprop1.description,*proprop1.keywords};
                     status= ProSurfaceAppearancepropsSet(&modelitem,&proprop);//设置零部件表,面属性
                  }
                }
        else
                if(m_danxuan==2&&m_danxuan1==0)
                {
                   status = ProSelect("part", -1, NULL,NULL, NULL, NULL, &sel, &n_sel);//选择零部件
               if(n_sel==0)
                   return ;
                    for(i=0;i<n_sel;i++)
                  {
                     status = ProSelectionModelitemGet(sel[i],&modelitem);
                     status= ProSurfaceAppearancepropsGet(&modelitem,&proprop1);//获得零件表面属性
                     ProSurfaceAppearanceProps proprop={0.5,0.5,0.5,0.5,0.0,{1,1,0},{0,0,1},proprop1.reflection,*proprop1.name,*proprop1.label,*proprop1.description,*proprop1.keywords};
                     status= ProSurfaceAppearancepropsSet(&modelitem,&proprop);//设置零部件表,面属性
                  }
                }
        else
                if(m_danxuan==3&&m_danxuan1==0)
                {
                   status = ProSelect("part", -1, NULL,NULL, NULL, NULL, &sel, &n_sel);//选择零部件
               if(n_sel==0)
                   return ;
                     for(i=0;i<n_sel;i++)
                   {
                     status = ProSelectionModelitemGet(sel[i],&modelitem);
                     status= ProSurfaceAppearancepropsGet(&modelitem,&proprop1);//获得零件表面属性
                     ProSurfaceAppearanceProps proprop={0.5,0.5,0.5,0.5,0.0,{1,0,1},{0,0,1},proprop1.reflection,*proprop1.name,*proprop1.label,*proprop1.description,*proprop1.keywords};
                     status= ProSurfaceAppearancepropsSet(&modelitem,&proprop);//设置零部件表,面属性
                   }
                }
        else
                if(m_danxuan==4&&m_danxuan1==0)
                {
                   status = ProSelect("part", -1, NULL,NULL, NULL, NULL, &sel, &n_sel);//选择零部件
               if(n_sel==0)
                   return ;
                     for(i=0;i<n_sel;i++)
                   {
                     status = ProSelectionModelitemGet(sel[i],&modelitem);
                     status= ProSurfaceAppearancepropsGet(&modelitem,&proprop1);//获得零件表面属性
                     ProSurfaceAppearanceProps proprop={0.5,0.5,0.5,0.5,0.0,{1,1,1},{0,0,1},proprop1.reflection,*proprop1.name,*proprop1.label,*proprop1.description,*proprop1.keywords};
                     status= ProSurfaceAppearancepropsSet(&modelitem,&proprop);//设置零部件表,面属性
                   }
                }
        else
                if(m_danxuan==5&&m_danxuan1==0)
                {
                   status = ProSelect("part", -1, NULL,NULL, NULL, NULL, &sel, &n_sel);//选择零部件
               if(n_sel==0)
                   return ;
                     for(i=0;i<n_sel;i++)
                   {
                      status = ProSelectionModelitemGet(sel[i],&modelitem);
                      status= ProSurfaceAppearancepropsGet(&modelitem,&proprop1);//获得零件表面属性
                      ProSurfaceAppearanceProps proprop={0.5,0.5,0.5,0.5,0.0,{0,1,0},{0,0,1},proprop1.reflection,*proprop1.name,*proprop1.label,*proprop1.description,*proprop1.keywords};
                      status= ProSurfaceAppearancepropsSet(&modelitem,&proprop);//设置零部件表,面属性
                   }
                }
        else
                if(m_danxuan==6&&m_danxuan1==0)
                {
                   status = ProSelect("part", -1, NULL,NULL, NULL, NULL, &sel, &n_sel);//选择零部件
               if(n_sel==0)
                   return ;
                     for(i=0;i<n_sel;i++)
                   {
                     status = ProSelectionModelitemGet(sel[i],&modelitem);
                     status= ProSurfaceAppearancepropsGet(&modelitem,&proprop1);//获得零件表面属性
                     ProSurfaceAppearanceProps proprop={0.5,0.5,0.5,0.5,0.0,{0,1,1},{0,1,1},proprop1.reflection,*proprop1.name,*proprop1.label,*proprop1.description,*proprop1.keywords};
                     status= ProSurfaceAppearancepropsSet(&modelitem,&proprop);//设置零部件表,面属性
                   }
                }
        else
                if(m_danxuan==7&&m_danxuan1==0)
                {
                   status = ProSelect("part", -1, NULL,NULL, NULL, NULL, &sel, &n_sel);//选择零部件
               if(n_sel==0)
                   return ;
                     for(i=0;i<n_sel;i++)
                   {
                     status = ProSelectionModelitemGet(sel[i],&modelitem);
                     status= ProSurfaceAppearancepropsGet(&modelitem,&proprop1);//获得零件表面属性
                     ProSurfaceAppearanceProps proprop={0.5,0.5,0.5,0.5,0.0,{0,0,1},{0,0,1},0.5,*proprop1.name,*proprop1.label,*proprop1.description,*proprop1.keywords};
                     status= ProSurfaceAppearancepropsSet(&modelitem,&proprop);//设置零部件表,面属性
                   }
                }

    //遍历着色(同零件相同色,不同零件不同色,8种颜色循环
        else
                if(m_danxuan1==1)
                {
                     status= ProMdlTypeGet(model, &type);
                     if(type==PRO_MDL_ASSEMBLY)
               {
                           status=ProSolidFeatVisit((ProSolid)model,(ProFeatureVisitAction)FeatureAsmVisitAcFn1,FeatFilterAction11,(CArray<ProFeature,ProFeature>*)&feat_list);
                           int num=(int)feat_list.GetCount();//一级遍历下总元件数
                           for (int i=0;i<num;i++)
             {
                              ProSolid mdl;
                              status=ProAsmcompMdlGet((ProAsmcomp *)(&feat_list[i]),(ProMdl *)&mdl);
                                  status = ProMdlToModelitem(mdl,&modelitem);
                  status=ProMdlTypeGet(mdl,&type1);//一级零部件特征类型
                                  status= ProSurfaceAppearancepropsGet(&modelitem,&proprop1);//获得零件表面属性
                                  ProSurfaceAppearanceProps proprop={0.8,0.8,0.7,0.6,0.0,{Color[j],Color[j+1],Color[j+2]},{0,0,1},proprop1.reflection,*proprop1.name,*proprop1.label,*proprop1.description,*proprop1.keywords};
                                 
                                  if(i>0&&i%7==0)//七种颜色循环遍历使用
                                          j=0;
                                  else
                                  {
                             j=j+3;
                                  }
                                  status= ProSurfaceAppearancepropsSet(&modelitem,&proprop);//设置零部件表,面属性
                         }
                   }
                }
               
        //模型重生
            UpdateData(FALSE);
                   status=ProWindowRepaint(-1);
                status = ProTreetoolRefresh(&model);
            ProSolidRegenerate((ProSolid)model,PRO_REGEN_NO_FLAGS);
            UsrActivateCurrentWindow();
}
回复

使用道具 举报

8

主题

53

回帖

0

威望

助工

积分
73
 楼主| 发表于 2018-11-20 09:07 | 显示全部楼层
ProError FeatureAsmVisitAcFn1(ProFeature *p_object,ProError status,CArray<ProFeature,ProFeature> * app_data)  

{          
        ProBoolean     isVisible;
        int         *  r_failed_feat_ids;
        int            num=0;
        ProBoolean     p_is_incomplete;
        ProFeatStatus  p_status;
        //特征过滤   
        //特征失败
        status=ProArrayAlloc(0,sizeof(int),1,(ProArray*)&r_failed_feat_ids);
        status=ProSolidFailedFeatsList((ProSolid)(p_object->owner),&r_failed_feat_ids);
        status=ProArraySizeGet((ProArray)r_failed_feat_ids,&num);
        //失败的特征不显示在树控件中
        /*for (int i=0;i<num;i++)
        {
                if (p_object->id==r_failed_feat_ids[i])
                {
                        ProArrayFree((ProArray*)&r_failed_feat_ids);
                        return PRO_TK_NO_ERROR;
                }
        }*/
        ProArrayFree((ProArray*)&r_failed_feat_ids);
        //特征不完整的
        status=ProFeatureIsIncomplete(p_object,&p_is_incomplete);
        if (p_is_incomplete!=PRO_B_FALSE) return PRO_TK_NO_ERROR;
        //特征没有被激活或特征被隐含(此处设置未激活和隐含的特征也显示在树控件中)
        status = ProFeatureStatusGet(p_object,&p_status);
   //if(p_status==PRO_FEAT_SUPPRESSED) return PRO_TK_NO_ERROR;
        //if(p_status!=PRO_FEAT_ACTIVE)    return PRO_TK_NO_ERROR;
        //特征可见
        status=ProFeatureVisibilityGet(p_object,&isVisible);
        if (isVisible==PRO_B_TRUE/*&&p_status==PRO_FEAT_UNREGENERATED*/)
        {
                app_data->Add(*p_object);
        }

        return PRO_TK_NO_ERROR;
}
回复

使用道具 举报

8

主题

53

回帖

0

威望

助工

积分
73
 楼主| 发表于 2018-11-20 09:08 | 显示全部楼层
ProError FeatFilterAction11(ProFeature* pFeature, ProAppData aData)
{

        int status;
        ProBoolean iVisible;
        ProFeattype type;
        status = ProFeatureVisibilityGet(pFeature, &iVisible);
        ProFeatureTypeGet (pFeature, &type);
        if ((iVisible == PRO_B_TRUE)&&(type==PRO_FEAT_COMPONENT))
                return(PRO_TK_NO_ERROR);
        else
                return(PRO_TK_CONTINUE);

}
回复

使用道具 举报

8

主题

53

回帖

0

威望

助工

积分
73
 楼主| 发表于 2018-11-20 09:08 | 显示全部楼层
376395728 发表于 2018-11-20 08:22
谢谢分享,但你给这个这个代码就想让大家都会这个?你不整个详细说明,这里95%的人都不会。。。

所有代码已发
回复

使用道具 举报

6

主题

492

回帖

6

威望

高工

积分
858
发表于 2018-11-20 09:24 | 显示全部楼层
大神你怎么那么牛~~~~~~~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

本站为非营利性站点,部分资源为网友搜集或发布,仅供学习和研究使用,如用于商业用途,请购买正版。站内所发布的资源,如有侵犯你的权益,请发邮件联系我们,本站将立即改正或删除。

手机版|小黑屋|野火论坛(©2007~2024) ( 苏ICP备11036728号-2 )苏公网安备 32039102000103号|站长QQ28016688

GMT+8, 2024-11-22 10:32 , Processed in 0.135468 second(s), 20 queries .

快速回复 返回顶部 返回列表