天天看點

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);
}


           

函數裡面有很多參數,這個要根據圖檔等細節去進行設定,可以考慮追加一個配置檔案進行處理

繼續閱讀