예제 #1
0
        /// <summary>
        /// Helper
        /// </summary>
        /// <param name="iParentInstance"></param>
        unsafe void getRGB_surfaceStyle(IFCTreeItem ifcTreeItem, IntPtr iParentInstance)
        {
            IntPtr stylesInstance;
            _ifcEngine.GetAttribute(iParentInstance, "Styles", IfcEngine.SdaiType.Aggregation, out stylesInstance);

            var iStylesCount = _ifcEngine.GetMemberCount(stylesInstance);
            for (int iStyle = 0; iStyle < iStylesCount.ToInt32(); iStyle++) {
                var iStyleInstance = IntPtr.Zero;
                _ifcEngine.GetAggregationElement(stylesInstance, iStyle, IfcEngine.SdaiType.Instance, out iStyleInstance);

                if (iStyleInstance == IntPtr.Zero) {
                    continue;
                }

                IntPtr surfaceColour;
                _ifcEngine.GetAttribute(iStyleInstance, "SurfaceColour", IfcEngine.SdaiType.Instance, out surfaceColour);

                if (surfaceColour == IntPtr.Zero) {
                    continue;
                }

                double R = 0;
                _ifcEngine.GetAttribute(surfaceColour, "Red", IfcEngine.SdaiType.Real, out *(IntPtr*)&R);

                double G = 0;
                _ifcEngine.GetAttribute(surfaceColour, "Green", IfcEngine.SdaiType.Real, out *(IntPtr*)&G);

                double B = 0;
                _ifcEngine.GetAttribute(surfaceColour, "Blue", IfcEngine.SdaiType.Real, out *(IntPtr*)&B);

                ifcTreeItem.ifcColor = new IFCItemColor();
                ifcTreeItem.ifcColor.R = (float)R;
                ifcTreeItem.ifcColor.G = (float)G;
                ifcTreeItem.ifcColor.B = (float)B;

                return;
            } // for (int iStyle = ...
        }
예제 #2
0
        /// <summary>
        /// Helper. 
        /// </summary>
        /// <param name="ifcTreeItem"></param>
        void GetColor(IFCTreeItem ifcTreeItem)
        {
            if (ifcTreeItem == null) {
                throw new ArgumentException("The item is null.");
            }

            // C++ => getRGB_object()
            IntPtr representationInstance;
            _ifcEngine.GetAttribute(ifcTreeItem.instance, "Representation", IfcEngine.SdaiType.Instance, out representationInstance);
            if (representationInstance == IntPtr.Zero) {
                return;
            }

            // C++ => getRGB_productDefinitionShape()
            IntPtr representationsInstance;
            _ifcEngine.GetAttribute(representationInstance, "Representations", IfcEngine.SdaiType.Aggregation, out representationsInstance);

            var iRepresentationsCount = _ifcEngine.GetMemberCount(representationsInstance);
            for (int iRepresentation = 0; iRepresentation < iRepresentationsCount.ToInt32(); iRepresentation++) {
                var iShapeInstance = IntPtr.Zero;
                _ifcEngine.GetAggregationElement(representationsInstance, iRepresentation, IfcEngine.SdaiType.Instance, out iShapeInstance);

                if (iShapeInstance == IntPtr.Zero) {
                    continue;
                }

                // C++ => getRGB_shapeRepresentation()
                IntPtr representationIdentifier;
                _ifcEngine.GetAttribute(iShapeInstance, "RepresentationIdentifier", IfcEngine.SdaiType.Unicode, out representationIdentifier);

                if (Marshal.PtrToStringUni(representationIdentifier) == "Body") {
                    IntPtr itemsInstance;
                    _ifcEngine.GetAttribute(iShapeInstance, "Items", IfcEngine.SdaiType.Aggregation, out itemsInstance);

                    var iItemsCount = _ifcEngine.GetMemberCount(itemsInstance);
                    for (int iItem = 0; iItem < iItemsCount.ToInt32(); iItem++) {
                        var iItemInstance = IntPtr.Zero;
                        _ifcEngine.GetAggregationElement(itemsInstance, iItem, IfcEngine.SdaiType.Instance, out iItemInstance);

                        IntPtr styledByItem;
                        _ifcEngine.GetAttribute(iItemInstance, "StyledByItem", IfcEngine.SdaiType.Instance, out styledByItem);

                        if (styledByItem != IntPtr.Zero) {
                            getRGB_styledItem(ifcTreeItem, styledByItem);
                        } else {
                            searchDeeper(ifcTreeItem, iItemInstance);
                        } // else if (iItemInstance != 0)

                        if (ifcTreeItem.ifcColor != null) {
                            return;
                        }
                    } // for (int iItem = ...
                }
            } // for (int iRepresentation = ...
        }
예제 #3
0
        /// <summary>
        /// Helper
        /// </summary>
        /// <param name="iStyledByItemInstance"></param>
        void getRGB_styledItem(IFCTreeItem ifcTreeItem, IntPtr iStyledByItemInstance)
        {
            IntPtr stylesInstance;
            _ifcEngine.GetAttribute(iStyledByItemInstance, "Styles", IfcEngine.SdaiType.Aggregation, out stylesInstance);

            var iStylesCount = _ifcEngine.GetMemberCount(stylesInstance);
            for (int iStyle = 0; iStyle < iStylesCount.ToInt32(); iStyle++) {
                var iStyleInstance = IntPtr.Zero;
                _ifcEngine.GetAggregationElement(stylesInstance, iStyle, IfcEngine.SdaiType.Instance, out iStyleInstance);

                if (iStyleInstance == IntPtr.Zero) {
                    continue;
                }

                getRGB_presentationStyleAssignment(ifcTreeItem, iStyleInstance);
            } // for (int iStyle = ...
        }
예제 #4
0
        /// <summary>
        /// Helper
        /// </summary>
        /// <param name="ifcTreeItem"></param>
        private IFCItem FindIFCItem(IFCItem ifcParent, IFCTreeItem ifcTreeItem)
        {
            if (ifcParent == null) {
                return null;
            }

            IFCItem ifcIterator = ifcParent;
            while (ifcIterator != null) {
                if (ifcIterator.ifcID == ifcTreeItem.instance) {
                    return ifcIterator;
                }

                IFCItem ifcItem = FindIFCItem(ifcIterator.child, ifcTreeItem);
                if (ifcItem != null) {
                    return ifcItem;
                }

                ifcIterator = ifcIterator.next;
            }

            return FindIFCItem(ifcParent.child, ifcTreeItem);
        }
예제 #5
0
        /// <summary>
        /// Helper
        /// </summary>
        /// <param name="ifcTreeItem"></param>
        private void FindNonReferencedIFCItems(IFCItem ifcParent, TreeNode tnNotReferenced)
        {
            if (ifcParent == null) {
                return;
            }

            IFCItem ifcIterator = ifcParent;
            while (ifcIterator != null) {
                if ((ifcIterator.ifcTreeItem == null) && (ifcIterator.ifcID != IntPtr.Zero)) {
                    string strItemText = "'" + (string.IsNullOrEmpty(ifcIterator.name) ? "<name>" : ifcIterator.name) +
                            "' = '" + (string.IsNullOrEmpty(ifcIterator.description) ? "<description>" : ifcIterator.description) +
                            "' (" + (string.IsNullOrEmpty(ifcIterator.ifcType) ? ifcIterator.globalID : ifcIterator.ifcType) + ")";

                    IFCTreeItem ifcTreeItem = new IFCTreeItem();
                    ifcTreeItem.instance = ifcIterator.ifcID;
                    ifcTreeItem.treeNode = tnNotReferenced.Nodes.Add(strItemText);
                    ifcTreeItem.ifcItem = FindIFCItem(_ifcRoot, ifcTreeItem);
                    ifcIterator.ifcTreeItem = ifcTreeItem;
                    ifcTreeItem.treeNode.Tag = ifcTreeItem;

                    if (ifcTreeItem.ifcItem != null) {
                        ifcTreeItem.ifcItem.ifcTreeItem = ifcTreeItem;
                        ifcTreeItem.treeNode.ImageIndex = ifcTreeItem.treeNode.SelectedImageIndex = IMAGE_CHECKED;
                    } else {
                        ifcTreeItem.treeNode.ImageIndex = ifcTreeItem.treeNode.SelectedImageIndex = IMAGE_NOT_REFERENCED;
                    }
                }

                FindNonReferencedIFCItems(ifcIterator.child, tnNotReferenced);

                ifcIterator = ifcIterator.next;
            }

            FindNonReferencedIFCItems(ifcParent.child, tnNotReferenced);
        }
예제 #6
0
        /// <summary>
        /// Helper
        /// </summary>
        /// <param name="ifcParent"></param>
        /// <param name="ifcItem"></param>
        private void CreatePropertyTreeItem(IFCTreeItem ifcParent, IFCTreeItem ifcItem, string strProperty)
        {
            IntPtr ifcType = _ifcEngine.GetInstanceType(ifcItem.instance);
            string strIfcType = Marshal.PtrToStringAnsi(ifcType);

            IntPtr name;
            _ifcEngine.GetAttribute(ifcItem.instance, "Name", IfcEngine.SdaiType.Unicode, out name);

            string strName = Marshal.PtrToStringUni(name);

            string strValue = string.Empty;
            switch (strProperty) {
                case "IFCQUANTITYLENGTH": {
                        IntPtr value;
                        _ifcEngine.GetAttribute(ifcItem.instance, "LengthValue", IfcEngine.SdaiType.Unicode, out value);

                        strValue = Marshal.PtrToStringUni(value);
                    }
                    break;

                case "IFCQUANTITYAREA": {
                        IntPtr value;
                        _ifcEngine.GetAttribute(ifcItem.instance, "AreaValue", IfcEngine.SdaiType.Unicode, out value);

                        strValue = Marshal.PtrToStringUni(value);
                    }
                    break;

                case "IFCQUANTITYVOLUME": {
                        IntPtr value;
                        _ifcEngine.GetAttribute(ifcItem.instance, "VolumeValue", IfcEngine.SdaiType.Unicode, out value);

                        strValue = Marshal.PtrToStringUni(value);
                    }
                    break;

                case "IFCQUANTITYCOUNT": {
                        IntPtr value;
                        _ifcEngine.GetAttribute(ifcItem.instance, "CountValue", IfcEngine.SdaiType.Unicode, out value);

                        strValue = Marshal.PtrToStringUni(value);
                    }
                    break;

                case "IFCQUANTITYWEIGTH": {
                        IntPtr value;
                        _ifcEngine.GetAttribute(ifcItem.instance, "WeigthValue", IfcEngine.SdaiType.Unicode, out value);

                        strValue = Marshal.PtrToStringUni(value);
                    }
                    break;

                case "IFCQUANTITYTIME": {
                        IntPtr value;
                        _ifcEngine.GetAttribute(ifcItem.instance, "TimeValue", IfcEngine.SdaiType.Unicode, out value);

                        strValue = Marshal.PtrToStringUni(value);
                    }
                    break;

                case "IFCPROPERTYSINGLEVALUE": {
                        IntPtr value;
                        _ifcEngine.GetAttribute(ifcItem.instance, "NominalValue", IfcEngine.SdaiType.Unicode, out value);

                        strValue = Marshal.PtrToStringUni(value);
                    }
                    break;

                default:
                    throw new Exception("Unknown property.");
            } // switch (strProperty)

            string strItemText = "'" + (string.IsNullOrEmpty(strName) ? "<name>" : strName) +
                    "' = '" + (string.IsNullOrEmpty(strValue) ? "<value>" : strValue) +
                    "' (" + strIfcType + ")";

            if ((ifcParent != null) && (ifcParent.treeNode != null)) {
                ifcItem.treeNode = ifcParent.treeNode.Nodes.Add(strItemText);
            } else {
                ifcItem.treeNode = _treeControl.Nodes.Add(strItemText);
            }

            if (ifcItem.ifcItem == null) {
                // item without visual representation
                ifcItem.treeNode.ForeColor = Color.Gray;
            }

            ifcItem.treeNode.ImageIndex = ifcItem.treeNode.SelectedImageIndex = IMAGE_PROPERTY;
        }
예제 #7
0
        /// <summary>
        /// Helper
        /// </summary>
        /// <param name="ifcParent"></param>
        /// <param name="ifcItem"></param>
        private void CreateTreeItem(IFCTreeItem ifcParent, IFCTreeItem ifcItem)
        {
            IntPtr ifcType = _ifcEngine.GetInstanceType(ifcItem.instance);
            string strIfcType = Marshal.PtrToStringAnsi(ifcType);

            IntPtr name;
            _ifcEngine.GetAttribute(ifcItem.instance, "Name", IfcEngine.SdaiType.Unicode, out name);

            string strName = Marshal.PtrToStringUni(name);

            IntPtr description;
            _ifcEngine.GetAttribute(ifcItem.instance, "Description", IfcEngine.SdaiType.Unicode, out description);

            string strDescription = Marshal.PtrToStringUni(description);

            string strItemText = "'" + (string.IsNullOrEmpty(strName) ? "<name>" : strName) +
                    "', '" + (string.IsNullOrEmpty(strDescription) ? "<description>" : strDescription) +
                    "' (" + strIfcType + ")";

            if ((ifcParent != null) && (ifcParent.treeNode != null)) {
                ifcItem.treeNode = ifcParent.treeNode.Nodes.Add(strItemText);
            } else {
                ifcItem.treeNode = _treeControl.Nodes.Add(strItemText);
            }

            if (ifcItem.ifcItem == null) {
                // item without visual representation
                ifcItem.treeNode.ForeColor = Color.Gray;
            }

            ifcItem.treeNode.Tag = ifcItem;
        }
예제 #8
0
        /// <summary>
        /// Helper
        /// </summary>
        private void CreateNotReferencedTreeItems()
        {
            IFCTreeItem ifcTreeItem = new IFCTreeItem();
            ifcTreeItem.treeNode = _treeControl.Nodes.Add("Not Referenced");
            ifcTreeItem.treeNode.ForeColor = Color.Gray;
            ifcTreeItem.treeNode.ImageIndex = ifcTreeItem.treeNode.SelectedImageIndex = IMAGE_CHECKED;
            ifcTreeItem.treeNode.Tag = ifcTreeItem;

            FindNonReferencedIFCItems(_ifcRoot, ifcTreeItem.treeNode);

            if (ifcTreeItem.treeNode.Nodes.Count == 0) {
                // don't show empty Not Referenced item
                _treeControl.Nodes.Remove(ifcTreeItem.treeNode);
            }
        }
예제 #9
0
        /// <summary>
        /// Helper
        /// </summary>
        private void CreateProjectTreeItems()
        {
            var iEntityID = _ifcEngine.GetEntityExtent(_ifcModel, "IfcProject");
            var iEntitiesCount = _ifcEngine.GetMemberCount(iEntityID);

            for (int iEntity = 0; iEntity < iEntitiesCount.ToInt32(); iEntity++) {
                IntPtr iInstance = IntPtr.Zero;
                _ifcEngine.GetAggregationElement(iEntityID, iEntity, IfcEngine.SdaiType.Instance, out iInstance);

                IFCTreeItem ifcTreeItem = new IFCTreeItem();
                ifcTreeItem.instance = iInstance;

                CreateTreeItem(null, ifcTreeItem);
                ifcTreeItem.treeNode.ImageIndex = ifcTreeItem.treeNode.SelectedImageIndex = IMAGE_CHECKED;

                AddChildrenTreeItems(ifcTreeItem, iInstance, "IfcSite");
            } // for (int iEntity = ...
        }
예제 #10
0
        /// <summary>
        /// Helper
        /// </summary>
        /// <param name="ifcParent"></param>
        /// <param name="iParentInstance"></param>     
        private void AddPropertyTreeItems(IFCTreeItem ifcParent, IntPtr iParentInstance)
        {
            IntPtr propertyInstances;
            _ifcEngine.GetAttribute(iParentInstance, "RelatingPropertyDefinition", IfcEngine.SdaiType.Instance, out propertyInstances);

            if (IsInstanceOf(propertyInstances, "IFCELEMENTQUANTITY")) {
                IFCTreeItem ifcPropertySetTreeItem = new IFCTreeItem();
                ifcPropertySetTreeItem.instance = propertyInstances;

                CreateTreeItem(ifcParent, ifcPropertySetTreeItem);
                ifcPropertySetTreeItem.treeNode.ImageIndex = ifcPropertySetTreeItem.treeNode.SelectedImageIndex = IMAGE_PROPERTY_SET;

                // check for quantity
                IntPtr quantitiesInstance;
                _ifcEngine.GetAttribute(propertyInstances, "Quantities", IfcEngine.SdaiType.Aggregation, out quantitiesInstance);

                if (quantitiesInstance == IntPtr.Zero) {
                    return;
                }

                var iQuantitiesCount = _ifcEngine.GetMemberCount(quantitiesInstance);
                for (int iQuantity = 0; iQuantity < iQuantitiesCount.ToInt32(); iQuantity++) {
                    var iQuantityInstance = IntPtr.Zero;
                    _ifcEngine.GetAggregationElement(quantitiesInstance, iQuantity, IfcEngine.SdaiType.Instance, out iQuantityInstance);

                    IFCTreeItem ifcQuantityTreeItem = new IFCTreeItem();
                    ifcQuantityTreeItem.instance = iQuantityInstance;

                    if (IsInstanceOf(iQuantityInstance, "IFCQUANTITYLENGTH"))
                        CreatePropertyTreeItem(ifcPropertySetTreeItem, ifcQuantityTreeItem, "IFCQUANTITYLENGTH");
                    else
                        if (IsInstanceOf(iQuantityInstance, "IFCQUANTITYAREA"))
                            CreatePropertyTreeItem(ifcPropertySetTreeItem, ifcQuantityTreeItem, "IFCQUANTITYAREA");
                        else
                            if (IsInstanceOf(iQuantityInstance, "IFCQUANTITYVOLUME"))
                                CreatePropertyTreeItem(ifcPropertySetTreeItem, ifcQuantityTreeItem, "IFCQUANTITYVOLUME");
                            else
                                if (IsInstanceOf(iQuantityInstance, "IFCQUANTITYCOUNT"))
                                    CreatePropertyTreeItem(ifcPropertySetTreeItem, ifcQuantityTreeItem, "IFCQUANTITYCOUNT");
                                else
                                    if (IsInstanceOf(iQuantityInstance, "IFCQUANTITYWEIGTH"))
                                        CreatePropertyTreeItem(ifcPropertySetTreeItem, ifcQuantityTreeItem, "IFCQUANTITYWEIGTH");
                                    else
                                        if (IsInstanceOf(iQuantityInstance, "IFCQUANTITYTIME"))
                                            CreatePropertyTreeItem(ifcPropertySetTreeItem, ifcQuantityTreeItem, "IFCQUANTITYTIME");
                } // for (int iQuantity = ...
            } else {
                if (IsInstanceOf(propertyInstances, "IFCPROPERTYSET")) {
                    IFCTreeItem ifcPropertySetTreeItem = new IFCTreeItem();
                    ifcPropertySetTreeItem.instance = propertyInstances;

                    CreateTreeItem(ifcParent, ifcPropertySetTreeItem);
                    ifcPropertySetTreeItem.treeNode.ImageIndex = ifcPropertySetTreeItem.treeNode.SelectedImageIndex = IMAGE_PROPERTY_SET;

                    // check for quantity
                    IntPtr propertiesInstance;
                    _ifcEngine.GetAttribute(propertyInstances, "HasProperties", IfcEngine.SdaiType.Aggregation, out propertiesInstance);

                    if (propertiesInstance == IntPtr.Zero) {
                        return;
                    }

                    var iPropertiesCount = _ifcEngine.GetMemberCount(propertiesInstance);
                    for (int iProperty = 0; iProperty < iPropertiesCount.ToInt32(); iProperty++) {
                        var iPropertyInstance = IntPtr.Zero;
                        _ifcEngine.GetAggregationElement(propertiesInstance, iProperty, IfcEngine.SdaiType.Instance, out iPropertyInstance);

                        if (!IsInstanceOf(iPropertyInstance, "IFCPROPERTYSINGLEVALUE"))
                            continue;

                        IFCTreeItem ifcPropertyTreeItem = new IFCTreeItem();
                        ifcPropertyTreeItem.instance = iPropertyInstance;

                        CreatePropertyTreeItem(ifcPropertySetTreeItem, ifcPropertyTreeItem, "IFCPROPERTYSINGLEVALUE");
                    } // for (int iProperty = ...
                }
            }
        }
예제 #11
0
        /// <summary>
        /// Helper
        /// </summary>
        /// <param name="ifcParent"></param>
        /// <param name="iParentInstance"></param>     
        private void AddElementTreeItems(IFCTreeItem ifcParent, IntPtr iParentInstance)
        {
            IntPtr decompositionInstance;
            _ifcEngine.GetAttribute(iParentInstance, "IsDecomposedBy", IfcEngine.SdaiType.Aggregation, out decompositionInstance);

            if (decompositionInstance == IntPtr.Zero) {
                return;
            }

            var iDecompositionsCount = _ifcEngine.GetMemberCount(decompositionInstance);
            for (int iDecomposition = 0; iDecomposition < iDecompositionsCount.ToInt32(); iDecomposition++) {
                var iDecompositionInstance = IntPtr.Zero;
                _ifcEngine.GetAggregationElement(decompositionInstance, iDecomposition, IfcEngine.SdaiType.Instance, out iDecompositionInstance);

                if (!IsInstanceOf(iDecompositionInstance, "IFCRELAGGREGATES")) {
                    continue;
                }

                IntPtr objectInstances;
                _ifcEngine.GetAttribute(iDecompositionInstance, "RelatedObjects", IfcEngine.SdaiType.Aggregation, out objectInstances);

                var iObjectsCount = _ifcEngine.GetMemberCount(objectInstances);
                for (int iObject = 0; iObject < iObjectsCount.ToInt32(); iObject++) {
                    IntPtr iObjectInstance = IntPtr.Zero;
                    _ifcEngine.GetAggregationElement(objectInstances, iObject, IfcEngine.SdaiType.Instance, out iObjectInstance);

                    IFCTreeItem ifcTreeItem = new IFCTreeItem();
                    ifcTreeItem.instance = iObjectInstance;
                    ifcTreeItem.ifcItem = FindIFCItem(_ifcRoot, ifcTreeItem);

                    CreateTreeItem(ifcParent, ifcTreeItem);

                    _dicCheckedElements[GetItemType(iObjectInstance)] = true;

                    if (ifcTreeItem.ifcItem != null) {
                        ifcTreeItem.ifcItem.ifcTreeItem = ifcTreeItem;
                        ifcTreeItem.treeNode.ImageIndex = ifcTreeItem.treeNode.SelectedImageIndex = IMAGE_CHECKED;
                    } else {
                        ifcTreeItem.treeNode.ImageIndex = ifcTreeItem.treeNode.SelectedImageIndex = IMAGE_NOT_REFERENCED;
                    }
                } // for (int iObject = ...
            } // for (int iDecomposition = ...

            // check for elements
            IntPtr elementsInstance;
            _ifcEngine.GetAttribute(iParentInstance, "ContainsElements", IfcEngine.SdaiType.Aggregation, out elementsInstance);

            if (elementsInstance == IntPtr.Zero) {
                return;
            }

            var iElementsCount = _ifcEngine.GetMemberCount(elementsInstance);
            for (int iElement = 0; iElement < iElementsCount.ToInt32(); iElement++) {
                IntPtr iElementInstance = IntPtr.Zero;
                _ifcEngine.GetAggregationElement(elementsInstance, iElement, IfcEngine.SdaiType.Instance, out iElementInstance);

                if (!IsInstanceOf(iElementInstance, "IFCRELCONTAINEDINSPATIALSTRUCTURE")) {
                    continue;
                }

                IntPtr objectInstances;
                _ifcEngine.GetAttribute(iElementInstance, "RelatedElements", IfcEngine.SdaiType.Aggregation, out objectInstances);

                var iObjectsCount = _ifcEngine.GetMemberCount(objectInstances);
                for (int iObject = 0; iObject < iObjectsCount.ToInt32(); iObject++) {
                    var iObjectInstance = IntPtr.Zero;
                    _ifcEngine.GetAggregationElement(objectInstances, iObject, IfcEngine.SdaiType.Instance, out iObjectInstance);

                    IFCTreeItem ifcTreeItem = new IFCTreeItem();
                    ifcTreeItem.instance = iObjectInstance;
                    ifcTreeItem.ifcItem = FindIFCItem(_ifcRoot, ifcTreeItem);

                    CreateTreeItem(ifcParent, ifcTreeItem);

                    _dicCheckedElements[GetItemType(iObjectInstance)] = true;

                    if (ifcTreeItem.ifcItem != null) {
                        ifcTreeItem.ifcItem.ifcTreeItem = ifcTreeItem;
                        ifcTreeItem.treeNode.ImageIndex = ifcTreeItem.treeNode.SelectedImageIndex = IMAGE_CHECKED;

                        GetColor(ifcTreeItem);
                    } else {
                        ifcTreeItem.treeNode.ImageIndex = ifcTreeItem.treeNode.SelectedImageIndex = IMAGE_NOT_REFERENCED;
                    }

                    IntPtr definedByInstances;
                    _ifcEngine.GetAttribute(iObjectInstance, "IsDefinedBy", IfcEngine.SdaiType.Aggregation, out definedByInstances);

                    if (definedByInstances == IntPtr.Zero) {
                        continue;
                    }

                    var iDefinedByCount = _ifcEngine.GetMemberCount(definedByInstances);
                    for (int iDefinedBy = 0; iDefinedBy < iDefinedByCount.ToInt32(); iDefinedBy++) {
                        var iDefinedByInstance = IntPtr.Zero;
                        _ifcEngine.GetAggregationElement(definedByInstances, iDefinedBy, IfcEngine.SdaiType.Instance, out iDefinedByInstance);

                        if (IsInstanceOf(iDefinedByInstance, "IFCRELDEFINESBYPROPERTIES")) {
                            AddPropertyTreeItems(ifcTreeItem, iDefinedByInstance);
                        } else {
                            if (IsInstanceOf(iDefinedByInstance, "IFCRELDEFINESBYTYPE")) {
                                // NA
                            }
                        }
                    }
                } // for (int iObject = ...
            } // for (int iDecomposition = ...
        }
예제 #12
0
        /// <summary>
        /// Helper
        /// </summary>
        /// <param name="ifcParent"></param>
        /// <param name="iParentInstance"></param>
        /// <param name="strEntityName"></param>
        private void AddChildrenTreeItems(IFCTreeItem ifcParent, IntPtr iParentInstance, string strEntityName)
        {
            // check for decomposition
            IntPtr decompositionInstance;
            _ifcEngine.GetAttribute(iParentInstance, "IsDecomposedBy", IfcEngine.SdaiType.Aggregation, out decompositionInstance);

            if (decompositionInstance == IntPtr.Zero) {
                return;
            }

            var iDecompositionsCount = _ifcEngine.GetMemberCount(decompositionInstance);
            for (int iDecomposition = 0; iDecomposition < iDecompositionsCount.ToInt32(); iDecomposition++) {
                IntPtr iDecompositionInstance = IntPtr.Zero;
                _ifcEngine.GetAggregationElement(decompositionInstance, iDecomposition, IfcEngine.SdaiType.Instance, out iDecompositionInstance);

                if (!IsInstanceOf(iDecompositionInstance, "IFCRELAGGREGATES")) {
                    continue;
                }

                IntPtr objectInstances;
                _ifcEngine.GetAttribute(iDecompositionInstance, "RelatedObjects", IfcEngine.SdaiType.Aggregation, out objectInstances);

                var iObjectsCount = _ifcEngine.GetMemberCount(objectInstances);
                for (int iObject = 0; iObject < iObjectsCount.ToInt32(); iObject++) {
                    IntPtr iObjectInstance = IntPtr.Zero;
                    _ifcEngine.GetAggregationElement(objectInstances, iObject, IfcEngine.SdaiType.Instance, out iObjectInstance);

                    if (!IsInstanceOf(iObjectInstance, strEntityName)) {
                        continue;
                    }

                    IFCTreeItem ifcTreeItem = new IFCTreeItem();
                    ifcTreeItem.instance = iObjectInstance;

                    CreateTreeItem(ifcParent, ifcTreeItem);
                    ifcTreeItem.treeNode.ImageIndex = ifcTreeItem.treeNode.SelectedImageIndex = IMAGE_CHECKED;

                    switch (strEntityName) {
                        case "IfcSite": {
                                AddChildrenTreeItems(ifcTreeItem, iObjectInstance, "IfcBuilding");
                            }
                            break;

                        case "IfcBuilding": {
                                AddChildrenTreeItems(ifcTreeItem, iObjectInstance, "IfcBuildingStorey");
                            }
                            break;

                        case "IfcBuildingStorey": {
                                AddElementTreeItems(ifcTreeItem, iObjectInstance);
                            }
                            break;

                        default:
                            break;
                    }
                } // for (int iObject = ...
            } // for (int iDecomposition = ...
        }
예제 #13
0
        /// <summary>
        /// Helper
        /// </summary>
        /// <param name="ifcTreeItem"></param>
        /// <param name="iParentInstance"></param>
        void searchDeeper(IFCTreeItem ifcTreeItem, IntPtr iParentInstance)
        {
            IntPtr styledByItem;
            _ifcEngine.GetAttribute(iParentInstance, "StyledByItem", IfcEngine.SdaiType.Instance, out styledByItem);

            if (styledByItem != IntPtr.Zero) {
                getRGB_styledItem(ifcTreeItem, styledByItem);
                if (ifcTreeItem.ifcColor != null) {
                    return;
                }
            }

            if (IsInstanceOf(iParentInstance, "IFCBOOLEANCLIPPINGRESULT")) {
                IntPtr firstOperand;
                _ifcEngine.GetAttribute(iParentInstance, "FirstOperand", IfcEngine.SdaiType.Instance, out firstOperand);

                if (firstOperand != IntPtr.Zero) {
                    searchDeeper(ifcTreeItem, firstOperand);
                }
            } // if (IsInstanceOf(iParentInstance, "IFCBOOLEANCLIPPINGRESULT"))
            else {
                if (IsInstanceOf(iParentInstance, "IFCMAPPEDITEM")) {
                    IntPtr mappingSource;
                    _ifcEngine.GetAttribute(iParentInstance, "MappingSource", IfcEngine.SdaiType.Instance, out mappingSource);

                    IntPtr mappedRepresentation;
                    _ifcEngine.GetAttribute(mappingSource, "MappedRepresentation", IfcEngine.SdaiType.Instance, out mappedRepresentation);

                    if (mappedRepresentation != IntPtr.Zero) {
                        IntPtr representationIdentifier;
                        _ifcEngine.GetAttribute(mappedRepresentation, "RepresentationIdentifier", IfcEngine.SdaiType.Unicode, out representationIdentifier);

                        if (Marshal.PtrToStringUni(representationIdentifier) == "Body") {
                            IntPtr itemsInstance;
                            _ifcEngine.GetAttribute(mappedRepresentation, "Items", IfcEngine.SdaiType.Aggregation, out itemsInstance);

                            var iItemsCount = _ifcEngine.GetMemberCount(itemsInstance);
                            for (int iItem = 0; iItem < iItemsCount.ToInt32(); iItem++) {
                                var iItemInstance = IntPtr.Zero;
                                _ifcEngine.GetAggregationElement(itemsInstance, iItem, IfcEngine.SdaiType.Instance, out iItemInstance);

                                styledByItem = IntPtr.Zero;
                                _ifcEngine.GetAttribute(iItemInstance, "StyledByItem", IfcEngine.SdaiType.Instance, out styledByItem);

                                if (styledByItem != IntPtr.Zero) {
                                    getRGB_styledItem(ifcTreeItem, styledByItem);
                                } else {
                                    searchDeeper(ifcTreeItem, iItemInstance);
                                } // else if (iItemInstance != 0)

                                if (ifcTreeItem.ifcColor != null) {
                                    return;
                                }
                            } // for (int iItem = ...
                        } // if (Marshal.PtrToStringAnsi(representationIdentifier) == "Body")
                    } // if (mappedRepresentation != IntPtr.Zero)
                } // if (IsInstanceOf(iParentInstance, "IFCMAPPEDITEM"))
            } // else if (IsInstanceOf(iParentInstance, "IFCBOOLEANCLIPPINGRESULT"))
        }
예제 #14
0
        /// <summary>
        /// Helper
        /// </summary>
        /// <param name="ifcTreeItem"></param>
        private void OnContextMenu_UpdateTreeElement(IFCTreeItem ifcTreeItem)
        {
            if (ifcTreeItem.ifcItem == null) {
                // skip not referenced items
                return;
            }

            if (string.IsNullOrEmpty(ifcTreeItem.ifcItem.ifcType)) {
                // skip fake items
                return;
            }

            if (!_dicCheckedElements.ContainsKey(ifcTreeItem.ifcItem.ifcType)) {
                // skip non-element items
                return;
            }

            ifcTreeItem.treeNode.ImageIndex = ifcTreeItem.treeNode.SelectedImageIndex =
                _dicCheckedElements[ifcTreeItem.ifcItem.ifcType] ? IMAGE_CHECKED : IMAGE_UNCHECKED;

            UpdateParentTreeItems(ifcTreeItem.treeNode);
        }