안녕하세요. 문의 주신 사항에 대한 답변 드립니다.
요청하신 내용은 각 Layer별 개별 가시화 제어 방법으로 확인되며, 아래 내용을 참고해 주시기 바랍니다.
1. U2dVectorShaderLayer.addGeoMetryAsWkt 를 사용하여 만든 feature의 개별 가시화 제어 설명
- vectorLayer의 cache를 순회 하여 검색 된 객체에 대해서 visible을 제어하는 방법
const cacheItems = vectorLayer._cache.items(); //현재 cache 의 값들을 반환
const cacheItemsList = Object.values(cacheItems); //key, value로 설정 되어있는 객체 value의 목록으로 반환
const targetFeatureId = feature.getId()// feature._fid; // feature.getId(); // 가시화 제어를 하려는 대상의 feature id
for (let i = 0; i < cacheItemsList.length; i++) {
const mesh = cacheItemsList[i];
const featureIds = mesh.userData.features;
if (featureIds && featureIds.length > 0 && featureIds.indexOf(targetFeatureId) > -1) {
mesh.visible = false; // 대상 가시화 제어
const tileKey = mesh.userData.tileKey;
const addedTile = vectorLayer._addedTile[tileKey]; // 업데이트시 ( 지도 이동 및 회전시 ) 가시화 대상에서 제외
if(addedTile){
const idx = addedTile.indexOf(mesh.name);
addedTile.splice(idx, 1);
}
/* mesh.visible = true 일 경우
const addedTile = vectorLayer._addedTile[tileKey]; // 업데이트시 ( 지도 이동 및 회전시 ) 가시화 대상에서 제외
if(addedTile){
const idx = addedTile.indexOf(mesh.name);
if(idx === -1)
addedTile.push(mesh.name);
}
*/
}
}
- removeGeometry를 사용하여 대상 geometry 제거 및 clear 하는 방법
const cacheItems = vectorLayer._cache.items(); //현재 cache 의 값들을 반환
const cacheItemsList = Object.values(cacheItems); //key, value로 설정 되어있는 객체 value의 목록으로 반환
const targetFeatureId = geometry.feature.getId() // feature._fid; // feature.getId();
for (let i = 0; i < cacheItemsList.length; i++) {
const mesh = cacheItemsList[i];
const featureIds = mesh.userData.features;
if (featureIds && featureIds.length > 0 && featureIds.indexOf(targetFeatureId) > -1) {
mesh.visible = false; //대상 선정 후 해당 객체 dispose 및 가시화 제어
mesh.geometry.dispose();
mesh.material.dispose();
vectorLayer._cache.delete(vectorLayer, mesh.name);
}
}
vectorLayer.removeGeometry(geometry); //removeGeometry 를 사용하여 해당 geometry 제거
2 . U3dModelDxfLayer의 mesh 개별 가시화 제어 설명
- styleFunction에서의 제어
function set3DStyleFunction(entity, mesh) {
// entity : 객체 생성시 사용된 정보 ( 타입, 레이어 이름 포함된 정보 )
// mesh : entity의 타입 정보로 생성된 3D 객체
if(!entity || !mesh) return;
const entityName = entity.layer;
if(!mesh.getLayerName) return;
const layerName = mesh.getLayerName();
const layer = app.getLayerByName(layerName);
const center = layer.getCenter();
//entity Type : ['3DFACE', 'LINE', 'LWPOLYLINE', ...]
if(entity.type === 'LINE'){
mesh.visible = true // 가시화 제어
}else if(entity.type === 'LWPOLYLINE' ){
mesh.visible = false // 가시화 제어
}
}
- layer의 group을 순회하여 대상을 지정하는 방법
U3dModelDxfLayer._group 의 children 정보

[0] name : faceGroup - 3dface type의 객체를 담고 있는 그룹
[1] name : polyGroup - 3dface 이외 line, lwpolyline 타입을 담고 있는 그룹
각 Mesh 들의 userData 속성 정보

해당 객체를 생성 할때 사용한 entity 정보를 mesh.userData.entity 속성에 저장하여 해당 정보를 순회하면서 검색시 사용 가능합니다.
또는 해당 mesh.position의 값으로 위치 정보를 대상으로 검색하여 제어하셔도 됩니다.
관련 내용에 대해서 질문 사항 있으시면 답변 부탁드리겠습니다.
감사합니다.
|