天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 54|回复: 0

ObjectARX-给cad实体贴图

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
ObjectARX-给cad实体贴图

做cad二次开发的时候,有时会生成三维实体,例如生成3d的钢筋,但是使用3d生成的钢筋比较难看,可以使用下面代码对实体进行贴图,比如找一张铁锈的图片放在钢筋上,就会显示的比较生动

AcDbObjectId CBaseDwg::CreateMaterial(const CString & materialName, COLORREF clr, const CString & pictureFilePath, AcDbDatabase * pDb)
{
    if (NULL == pDb)
        pDb = acdbCurDwg();
    AcDbObjectId idMater = AcDbObjectId::kNull;
    AcDbDictionary* pMatDict = NULL;
    if (Acad::eOk != pDb->getMaterialDictionary(pMatDict, AcDb::kForWrite))
        return idMater;
    if (pMatDict->has(materialName))
    {
        pMatDict->getAt(materialName, idMater);
    }
    else
    {
        AcDbMaterial* pmatObj = new AcDbMaterial;
        pMatDict->setAt(materialName, pmatObj, idMater);
        //材质设置
        AcGiMaterialColor clrMat;
        clrMat.setMethod(AcGiMaterialColor::kOverride);
        clrMat.setFactor(1.0);
        clrMat.setColor(AcCmEntityColor(GetRValue(clr), GetGValue(clr), GetBValue(clr)));
        //添加图片
        AcGiImageFileTexture diffuseMapFile;
        diffuseMapFile.setSourceFileName(pictureFilePath);
        //diffuse map
        AcGiMaterialMap diffuseMap;
        diffuseMap.setTexture(&diffuseMapFile);
        //控制贴图比例
        AcGeMatrix3d transform;
        transform.setToIdentity();
        transform.setToScaling(0.1);
        AcGiMapper mapper;
        mapper = diffuseMap.mapper();
        mapper.setTransform(transform);
        diffuseMap.setMapper(mapper);
        pmatObj->setDiffuse(clrMat, diffuseMap);
        pmatObj->setMode(AcGiMaterialTraits::kRealistic);
        double value = 1.0;
        AcGiMaterialMap opacityMap;
        pmatObj->opacity(value, opacityMap);
        pmatObj->setOpacity(20, opacityMap);//?
        pmatObj->close();
    }
    pMatDict->close();
    return idMater;
}
void CBaseDwg::SetMaterialToEntity(const AcDbObjectId &entId, const AcDbObjectId & materialId)
{
    AcDbEntityPointer pointer;
    if (Acad::eOk != pointer.open(entId, AcDb::kForWrite))
        return;
    pointer->setMaterial(materialId, Adesk::kFalse);
}

 

 

 

 

ObjectARX-给cad实体贴图
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 10:30 , Processed in 0.156476 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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