0

我想通过鼠标单击选择实体列表,然后需要它们的属性。我知道可以通过使用来选择实体(请查看代码)

但是如何获得这个实体列表的属性(例如,如果实体是圆柱体并且需要它的起点和终点)

controlDrawing.ViewportLayoutTower.ActionMode = devDept.Eyeshot.actionType.SelectByPick
4

2 回答 2

0

您可以简单地在MouseDown控件的情况下找到鼠标下的所有实体并从中获取您想要的内容。

private void myViewport_MouseDown(object sender, MouseEventArgs e)
{
    // if left click
    if (e.Button == MouseButtons.Left)
    {
        // get all entities under the mouse cursor
        var entityIndexes = myViewport.GetAllEntitiesUnderMouseCursor(e.Location);
        
        // if there is any entities
        if entityIndexes.Any())
        {
            foreach(var index in entityIndexes)
            {
                 // get the entity and do something
                 var entity = myViewport.Entities[index];
            }
        }        
    }
}
于 2020-09-18T14:58:12.580 回答
0

您正在寻找选角。当将对象放入视口和将对象拉出视口时,它们总是被转换为实体,因为这是所有实体的父类。如果您想要圆柱体属性,您需要将其转换为您添加到视口的任何子类。不幸的是,Entity 没有 Cylinder 子类,所以我假设您制作了 Mesh.CreateCylinder()。这是一个 Mesh 类,您传递给函数的变量(起点和终点)在函数的本地范围内,不再可供 Mesh 类访问。

绕过此问题的一种方法是将此信息添加到实体的 EntityData 属性中。此属性可以保存您制作的任何对象。

        public class myCylinderEntData
        {
            public double radius = 2d;
            public double height = 5d;
            public int slices = 10;
        }

        double dRadius = 2d;
        double dHeight = 5d;
        int iSlices = 10;
        myCylinderEntData cyl1EntData = new myCylinderEntData() { radius = dRadius, height = dHeight, slices = iSlices };
        Mesh cylinder1 =  Mesh.CreateCylinder(dRadius, dHeight, iSlices);
        cylinder1.EntityData = cyl1EntData;
        vp1.Entities.Add(cylinder1); // Add to viewport

        Entity retrivedEnt = vp1.Entities[0];
        myCylinderEntData myRetrievedEntData = (myCylinderEntData)retrivedEnt.EntityData; // get Data back after clicked


        int[] clickedEntsIndex = vp1.GetAllEntitiesUnderMouseCursor(Cursor.Position);// e.Location) ;  // retrieve from viewport

此外,如果它是继承 Entity 的类的可用属性,您可以像这样检索该属性。

        int[] clickedEntsIndex = vp1.GetAllEntitiesUnderMouseCursor(Cursor.Position);// e.Location) ;  // retrieve from viewport
        foreach(int index in clickedEntsIndex)
        {
             if(vp1.Entities[index] is Mesh) // Check object type for whichever child class you want to convert to
            {
                Mesh myClickedMesh = (Mesh)vp1.Entities[index];
                // Here you access to all of your Meshes public Variables
            }
            else if (vp1.Entities[index] is Solid)
            {
                Solid myClickedSolid = (Solid)vp1.Entities[index];
                // Here you access to all of your Solid public Variables
            }
        }
于 2020-09-23T21:29:31.257 回答