首页 / 浏览问题 / 三维GIS / 问题详情
Plugin中 三维模型中对象更改颜色
17EXP 2017年02月28日
function ChangeColor(){
                var layer3Ds = scene.get_layer3Ds();
                layer3D = layer3Ds.get_item(0);
                selection3Ds = scene.findSelection3Ds(true);
                if (selection3Ds.length === 0) {
                    alert("没有对象被选中。");
                    return;
                }
                if (selection3Ds !== null) {
                    var id = selection3Ds[0].get_item(0);
                    selection3Ds[0].removeAll();
                    var feature3D = layer3D.findFeature3DByID(id);
                    
                    var regionRed = Number(document.getElementById("regionRed").value);
                    var regionGreen = Number(document.getElementById("regionGreen").value);
                    var regionBlue = Number(document.getElementById("regionBlue").value);
                        
                    var style = new SuperMap.Web.Core.Style3D();
                    //style.set_lineWidth(10003);
                    style.set_fillForeColor(new SuperMap.Web.Core.Color(regionRed, regionGreen, regionBlue, 100));
                    feature3D.set_style3D(style);

                } else {
                    alert("没有对象被选中。");
                }
            }

代码如上,选中一个对象后触发方法,对象的颜色没有改变。请问怎么能实现该方法? 谢谢

1个回答

您好,请问你获取的是什么对象,场景有没有生成缓存?
3,389EXP 2017年02月28日

图中标注的构件
上传到Iserver前生成了缓存的

OSGB缓存吗?如果是那么这句是取不到值的:

var feature3D = layer3D.findFeature3DByID(id);


这是缓存的文件夹,就是在8C中生成的场景缓存,然后发布到iserver的服务

这句话 var feature3D = layer3D.findFeature3DByID(id); 可以取到对象,

我调用feature3D.set_isVisible(false);是可以正常的

PS,刚接触BIM一类的,不知道是和上传的模型有没有关系

能获取到说明是矢量缓存。文件格式也确实是矢量缓存。

您好,矢量缓存设置不了对象的颜色,您直接修改选择集的颜色吧。

如果要对对象分别设置颜色,可以考虑OSGB缓存,可以设置每个对象的颜色。

我重新把模型在8C里面建立两个场景,分别用矢量模式和OSGB模式生成的缓存,后从新发布的服务,在Plugin中分别加在两个场景,都没有改变颜色。

还有,请问下,Plugin中怎么划线,选择区域操作呢。谢谢
OSGB的是专门的接口。不是用您上面的方法,Layer3DOSGB.setObjectsVisible。

划线是指?
请问有具体的API链接么,我看的是Plugin的API帮助文档,里面没有提到过

划线是指,在场景中绘制一条线段

iClent3D帮助手册搜setObjectsVisible就出来了。

绘线是可以的,把场景action设置为量算或者您自定义一个action,然后用

instanceOfSceneControl.addEvent(eventName, handler)添加事件,即当 eventName 指定的事件发生时,完成 handler 回调函数中的操作。 把获取的线添加到跟踪层,或者数据集(保存到数据集需要iserver提供的数据服务才行)。 如果要画线选中区域,还要用空间查询,二维的空间查询。
http://support.supermap.com.cn:8090/iserver/iClient/forJavaScript/examples/examples.html#getFeatureByGeometry

对象隐藏已经实现了。现在是更改构件的颜色,按照你上面说的在矢量缓存和OSGB缓存两个场景下使用下面的代码都没有实现

var feature3D = layer3D.findFeature3DByID(id);

style.set_fillForeColor(new SuperMap.Web.Core.Color(regionRed, regionGreen, regionBlue, 100));
feature3D.set_style3D(style);

另外你说的划线方案,我在提供的active插件版本的量测Demo里,不能触发量测完成事件是什么原因呢(可以进行绘制,但是不能结束绘制[单击双击都不行],也没有显示量测结果)

谢谢

您是想改变选择对象的颜色还是分别设置不同颜色?
后者。
我选中一个对象,设置一个颜色,然后选中另一个对象设置另一种颜色

那就是用这个:

layer3d.setObjectsColor。

右键触发完成事件。

您可以参考这个:

http://support.supermap.com.cn:8090/iserver/iClient/for3D/plugin/samplecode/samplecode/samples/Query3D/Measure.html

function ChangeColor(){
                var layer3Ds = scene.get_layer3Ds();
                layer3D = layer3Ds.get_item(0);
                selection3Ds = scene.findSelection3Ds(true);
                if (selection3Ds.length === 0) {
                    alert("没有对象被选中。");
                    return;
                }
                if (selection3Ds !== null) {
                    var id = selection3Ds[0].get_item(0);
                    var regionRed = Number(document.getElementById("regionRed").value);
                    var regionGreen = Number(document.getElementById("regionGreen").value);
                    var regionBlue = Number(document.getElementById("regionBlue").value);
                    var a=[Number(id)];
                    layer3D.setObjectsColor(a,new SuperMap.Web.Core.Color(regionRed, regionGreen, regionBlue, 255));

                } else {
                    alert("没有对象被选中。");
                }
            }
上面代码在两种场景下都没有效果
你好,可以QQ(562366373)交谈或者远程协助一下么
要OSGB缓存才行。
是的,我两个场景一个是矢量缓存,一个是OSGB缓存的。但是都没有效果的

layer3D.setObjectsColor(a,new SuperMap.Web.Core.Color(regionRed, regionGreen, regionBlue, 255));

第一个参数 a  要是一个数组哦,您的是数组吗?

var a=[Number(id)];

layer3D.setObjectsColor(a,new SuperMap.Web.Core.Color(regionRed, regionGreen, regionBlue, 255));

是的啊,还有别的什么情况会导致这个问题么?

加你QQ远程看下。
远程测试是OSGB图层的对象是可以修改颜色的。
...