예제 #1
0
        void SetCurrentMaterial(string uidMaterial)
        {
            if (!_materials.ContainsKey(uidMaterial))
            {
                RMaterial material = CurrentDocument.GetElement(uidMaterial) as RMaterial;

                Color c = material.Color;

                MaterialBuilder m;
                if (material.Transparency != 0)
                {
                    m = new MaterialBuilder()
                        .WithAlpha(AlphaMode.BLEND)
                        .WithDoubleSide(true)
                        .WithMetallicRoughnessShader()
                        .WithChannelParam("BaseColor", new Vector4(c.Red / 256f, c.Green / 256f, c.Blue / 256f, 1 - (material.Transparency / 128f)));
                }
                else
                {
                    m = new MaterialBuilder()
                        .WithDoubleSide(true)
                        .WithMetallicRoughnessShader()
                        .WithChannelParam("BaseColor", new Vector4(c.Red / 256f, c.Green / 256f, c.Blue / 256f, 1));
                }
                m.UseChannel("MetallicRoughness");
                _materials.Add(uidMaterial, m);
            }
            _material = _materials[uidMaterial];
        }
예제 #2
0
        protected Element FindMonitoredElementInSameSpace(Element local)
        {
            var id = local.GetMonitoredLinkElementIds().First();

            var linkInst = (RevitLinkInstance)CurrentDocument.GetElement(id);
            var linkDoc  = linkInst.GetLinkDocument();

            var elems = CaptureElementsOfSameCategory(local, linkDoc);

            var final = FilterElements(elems.ToArray(), (FamilyInstance)local);

            return(final);
        }
예제 #3
0
        /// <summary>
        /// 设置材质
        /// </summary>
        /// <remarks>
        //可以为每个单独的输出网格调用OnMaterial方法
        ///即使材质尚未实际更改。 因此通常
        ///有利于存储当前材料并仅获取其属性
        ///当材质实际更改时。
        /// </remarks>
        public void OnMaterial(MaterialNode node)
        {
            ElementId id = node.MaterialId;

            //是无效的objectID设置为默认的默认objectID
            if (ElementId.InvalidElementId != id)
            {
                Element m = CurrentDocument.GetElement
                                (node.MaterialId);
                SetCurrentMaterial(m.UniqueId, node);
            }
            else
            {
                SetDefaultMaterial();
            }
        }
예제 #4
0
        /// <summary>
        /// 此方法标记要导出的图元的开始
        /// </summary>
        /// <param name="elementId"></param>
        /// <returns></returns>
        public RenderNodeAction OnElementBegin(ElementId elementId)
        {
            Element e = CurrentDocument.GetElement(elementId);

            if (e != null)
            {
                if (null == e.Category)
                {
                    return(RenderNodeAction.Skip);
                }
            }

            //创建一个网格
            _currentMesh = new MeshBuilder <VERTEX, VertexTexture1>(elementId.IntegerValue.ToString());
            return(RenderNodeAction.Proceed);
        }
예제 #5
0
        public void OnMaterial(MaterialNode node)
        {
            ElementId id = node.MaterialId;

            if (ElementId.InvalidElementId != id)
            {
                Element m = CurrentDocument.GetElement(node.MaterialId);
                SetCurrentMaterial(m.UniqueId);
            }
            else
            {
                SetDefaultMaterial();
            }


            Debug.Print($"Material {node.NodeName}");
        }
예제 #6
0
        public RenderNodeAction OnElementBegin(ElementId elementId)
        {
            Element e = CurrentDocument.GetElement(elementId);

            if (e != null)
            {
                if (null == e.Category)
                {
                    Debug.WriteLine("\r\n*** Non-category element!\r\n");
                    return(RenderNodeAction.Skip);
                }
            }


            _mesh = new MeshBuilder <VERTEX>(elementId.IntegerValue.ToString());
            Debug.Print($"ElementBegin {elementId.IntegerValue}");
            return(RenderNodeAction.Proceed);
        }
예제 #7
0
        protected Element SelectElement()
        {
            Element local;
            bool    result;

            using (var sel = UiDocument.Selection)
            {
                var refer = sel.PickObject(ObjectType.Element, "Select the item you'd like to update");
                local = CurrentDocument.GetElement(refer);
            }

            if (local == null || !local.IsMonitoringLinkElement())
            {
                return(null);
            }

            return(local);
        }
예제 #8
0
        public void OnElementEnd(ElementId elementId)
        {
            Element e = CurrentDocument.GetElement(elementId);

            if (e != null)
            {
                if (null == e.Category)
                {
                    Debug.WriteLine("\r\n*** Non-category element!\r\n");
                    return;
                }
            }

            if (_mesh.Primitives.Count > 0)
            {
                _scene.CreateNode().WithMesh(_model.CreateMeshes(_mesh)[0]);
            }
            Debug.Print($"ElementEnd {elementId.IntegerValue}");
        }
예제 #9
0
        private IList <Element> PromptUserToSelectObjects()
        {
            IList <Element> selectedElements = new List <Element>();

            using (Selection selected = UiDocument.Selection)
            {
                IEnumerable <Reference> refObjects = selected.PickObjects(ObjectType.Element);

                // for some reason this doesn't work with ElementIds?
                //IEnumerable<ElementId> selectedElementIds =
                //    refObjects.SelectMany<Reference, ElementId>(x => x.ElementId);

                foreach (Reference r in refObjects)
                {
                    ElementId referenceId = r.ElementId;
                    selectedElements.Add(CurrentDocument.GetElement(referenceId));
                }
            }

            return(selectedElements);
        }
예제 #10
0
        /// <summary>
        /// 导出图元结束
        /// </summary>
        /// <param name="elementId"></param>
        public void OnElementEnd(ElementId elementId)
        {
            Element e = CurrentDocument.GetElement(elementId);

            if (e != null)
            {
                if (null == e.Category)
                {
                    return;
                }
            }

            if (_currentMesh.Primitives.Count > 0)
            {
                var meshes = Model.CreateMeshes(_currentMesh);

                foreach (var mesh in meshes)
                {
                    _scene.CreateNode().WithMesh(mesh);
                }
            }
        }
        private bool CanPassFilterRules(ParameterFilterElement filter, ElementId elemId)
        {
            Element elem = CurrentDocument.GetElement(elemId);

            if (elem == null)
            {
                return(false);
            }

            bool bPassed = true;

            foreach (FilterRule rule in filter.GetRules())
            {
                if (!rule.ElementPasses(elem))
                {
                    bPassed = false;
                    break;
                }
            }

            return(bPassed);
        }
 /// <summary>
 /// 设置当前材质
 /// </summary>
 /// <param name="uidMaterial"></param>
 void SetCurrentMaterial(string uidMaterial)
 {
     if (!_materials.ContainsKey(uidMaterial))
     {
         RMaterial       material = CurrentDocument.GetElement(uidMaterial) as RMaterial;
         Color           c        = material.Color;
         MaterialBuilder m        = null;
         try
         {
             if (material.Transparency != 0)
             {
                 m = new MaterialBuilder()
                     .WithAlpha(SharpGLTF.Materials.AlphaMode.BLEND)
                     .WithDoubleSide(true)
                     .WithMetallicRoughnessShader()
                     .WithChannelParam("BaseColor", new Vector4(c.Red / 256f, c.Green / 256f, c.Blue / 256f, 1 - (material.Transparency / 128f)));
                 // .WithChannelParam("BaseColor", new Vector4(currentColor.Red / 256f, currentColor.Green / 256f, currentColor.Blue / 256f, (float)currentTransparency));
             }
             else
             {
                 m = new MaterialBuilder()
                     .WithDoubleSide(true)
                     .WithMetallicRoughnessShader()
                     .WithChannelParam("BaseColor", new Vector4(c.Red / 256f, c.Green / 256f, c.Blue / 256f, 1));
                 // .WithChannelParam("BaseColor", new Vector4(currentColor.Red / 256f, currentColor.Green / 256f, currentColor.Blue / 256f, (float)currentTransparency));
             }
         }
         catch (Exception e)
         {
             Debug.Print("{0} Second exception.", e.Message);
         }
         m.UseChannel("MetallicRoughness");
         _materials.Add(uidMaterial, m);
     }
     _material = _materials[uidMaterial];
 }
예제 #13
0
        /// <summary>
        /// 设置当前材质
        /// </summary>
        /// <param name="uidMaterial"></param>
        void SetCurrentMaterial(string uidMaterial, MaterialNode node)
        {
            if (!_materials.ContainsKey(uidMaterial))
            {
                RMaterial       material = CurrentDocument.GetElement(uidMaterial) as RMaterial;
                Color           c        = material.Color;
                MaterialBuilder m        = null;
                try
                {
                    if (material.Transparency != 0)
                    {
                        m = new MaterialBuilder()
                            .WithAlpha(SharpGLTF.Materials.AlphaMode.BLEND)
                            .WithDoubleSide(true)
                            .WithMetallicRoughnessShader()
                            .WithChannelParam(KnownChannel.BaseColor, new Vector4(c.Red / 256f, c.Green / 256f, c.Blue / 256f, 1 - (material.Transparency / 128f)));
                    }
                    else
                    {
                        m = new MaterialBuilder()
                            .WithDoubleSide(true)
                            .WithMetallicRoughnessShader()
                            .WithChannelParam(KnownChannel.BaseColor, new Vector4(c.Red / 256f, c.Green / 256f, c.Blue / 256f, 1));
                    }
                    Autodesk.Revit.DB.Visual.Asset currentAsset;
                    if (node.HasOverriddenAppearance)
                    {
                        currentAsset = node.GetAppearanceOverride();
                    }
                    else
                    {
                        currentAsset = node.GetAppearance();
                    }

                    try
                    {
                        //取得Asset中贴图信息
                        Autodesk.Revit.DB.Visual.Asset findAssert = FindTextureAsset(currentAsset as AssetProperty);
                        if (findAssert != null)
                        {
                            string textureFile = (findAssert["unifiedbitmap_Bitmap"] as AssetPropertyString).Value.Split('|')[0];
                            //用Asset中贴图信息和注册表里的材质库地址得到贴图文件所在位置
                            string textureName = textureFile.Replace("/", "\\");

                            string texturePath = Path.Combine(_textureFolder, textureName);

                            m.WithChannelImage(KnownChannel.BaseColor, texturePath);
                        }
                    }
                    catch (Exception e)
                    {
                    }
                }
                catch (Exception e)
                {
                }

                _materials.Add(uidMaterial, m);
            }
            _currentMaterial = _materials[uidMaterial];
        }
        private void GatherFilterColorOverride()
        {
            if (CurrentDocument == null || CurrentView == null)
            {
                return;
            }

            ICollection <ElementId> filterIds = null;

            try
            {
                filterIds = CurrentView.GetFilters();
                if (filterIds == null || filterIds.Count < 1)
                {
                    return;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }

            foreach (ElementId idFilter in filterIds)
            {
                try
                {
                    ParameterFilterElement filter = CurrentDocument.GetElement(idFilter) as ParameterFilterElement;
                    if (filter == null)
                    {
                        continue;
                    }

                    OverrideGraphicSettings overrideSettings = CurrentView.GetFilterOverrides(idFilter);
                    if (overrideSettings == null)
                    {
                        continue;
                    }

                    if (!overrideSettings.ProjectionFillColor.IsValid)
                    {
                        continue;
                    }

                    AddMaterial(filter.Name, overrideSettings.ProjectionFillColor);

                    List <ElementId> listElem = new List <ElementId>();
                    var cids = filter.GetCategories();
                    if (cids == null)
                    {
                        continue;
                    }

                    foreach (ElementId catID in cids)
                    {
                        FilteredElementCollector collector = (new FilteredElementCollector(CurrentDocument, CurrentView.Id)).OfCategoryId(catID);
                        var lstid = collector.ToElementIds() as List <ElementId>;
                        if (lstid == null)
                        {
                            continue;
                        }

                        listElem.AddRange(lstid);
                    }

                    List <ElementId> elemPassed = new List <ElementId>();
                    foreach (ElementId elemId in listElem)
                    {
                        if (CanPassFilterRules(filter, elemId))
                        {
                            elemPassed.Add(elemId);
                        }
                    }

                    foreach (ElementId elemId in elemPassed)
                    {
                        if (!m_dictElemColor.ContainsKey(elemId))
                        {
                            m_dictElemColor.Add(elemId, filter.Name);
                        }
                    }
                }
                catch (Exception)
                {
                    continue;
                }
            }
        }
예제 #15
0
        public void Execute(UIApplication app)
        {
            try
            {
                CurrentDocument = app.ActiveUIDocument.Document;

                switch (MoverRequest.Take())
                {
                case RequestId.SelectLinkInstance:
                    MainWindowInstance.DozeOff();
                    var picked = PickLinkInstance(out selectedLink);
                    if (picked)
                    {
                        MainWindowInstance.DisplayCategories(selectedLink);
                    }
                    MainWindowInstance.WakeUp();
                    break;

                case RequestId.DuplicateElements:
                    MainWindowInstance.DozeOff();
                    try
                    {
                        selectedLink = ElementMoverUtil.DuplicateSelectedCategories(selectedLink, CurrentDocument, SelectedUpdateMode);
                        if (LinkInstances.ContainsKey(selectedLink.InstanceId))
                        {
                            LinkInstances.Remove(selectedLink.InstanceId);
                        }
                        LinkInstances.Add(selectedLink.InstanceId, selectedLink);
                        MainWindowInstance.UpdateLinkedInstanceProperties();
                    }
                    catch (Exception ex)
                    {
                        var message = ex.Message;
                    }
                    MainWindowInstance.WakeUp();
                    break;

                case RequestId.SelectMappingElements:
                    MappingWindowInstance.DozeOff();
                    Element sourceElement = null;
                    Element targetElement = null;
                    var     pickedMap     = PickMappingElements(out sourceElement, out targetElement);
                    if (pickedMap)
                    {
                        if (LinkInstances.ContainsKey(selectedLink.InstanceId))
                        {
                            LinkInstances.Remove(selectedLink.InstanceId);
                        }
                        LinkInstances.Add(selectedLink.InstanceId, selectedLink);
                        MappingWindowInstance.RefreshLinkInstance();
                    }
                    MappingWindowInstance.WakeUp();
                    break;

                case RequestId.DeleteMappingElements:
                    MappingWindowInstance.DozeOff();
                    if (LinkedElementToDelete.Count > 0)
                    {
                        using (var trans = new Transaction(CurrentDocument))
                        {
                            trans.Start("Delete Element Maps");
                            try
                            {
                                foreach (var linkedInfo in LinkedElementToDelete)
                                {
                                    if (selectedLink.LinkedElements.ContainsKey(linkedInfo.LinkedElementId))
                                    {
                                        selectedLink.LinkedElements.Remove(linkedInfo.LinkedElementId);
                                        var linkedElement = CurrentDocument.GetElement(linkedInfo.LinkedElementId);
                                        if (null != linkedElement)
                                        {
                                            var removed = MoverDataStorageUtil.RemoveLinkedElementInfo(linkedElement);
                                        }
                                    }
                                }
                                trans.Commit();
                                if (LinkInstances.ContainsKey(selectedLink.InstanceId))
                                {
                                    LinkInstances.Remove(selectedLink.InstanceId);
                                    LinkInstances.Add(selectedLink.InstanceId, selectedLink);
                                }
                            }
                            catch (Exception ex)
                            {
                                trans.RollBack();
                                MessageBox.Show("Failed to delete element maps.\n" + ex.Message, "Delete Element Maps", MessageBoxButton.OK, MessageBoxImage.Warning);
                            }
                        }
                        MappingWindowInstance.RefreshLinkInstance();
                    }
                    MappingWindowInstance.WakeUp();
                    break;

                case RequestId.ShowElement:
                    MappingWindowInstance.DozeOff();
                    if (null != SelectedLinkedInfo)
                    {
                        if (null != CurrentDocument.GetElement(SelectedLinkedInfo.LinkedElementId))
                        {
                            HighlightElement();
                        }
                    }
                    MappingWindowInstance.WakeUp();
                    break;

                case RequestId.AddFamilyMapping:
                    FamilyWindowInstance.DozeOff();
                    if (null != SelectedFamilyInfo)
                    {
                        var tType = CurrentDocument.GetElement(SelectedFamilyInfo.TargetTypeId) as ElementType;
                        if (null != tType)
                        {
                            using (var trans = new Transaction(CurrentDocument))
                            {
                                trans.Start("Add Family Map");
                                try
                                {
                                    if (selectedLink.LinkedFamilies.ContainsKey(SelectedFamilyInfo.TargetTypeId))
                                    {
                                        selectedLink.LinkedFamilies.Remove(SelectedFamilyInfo.TargetTypeId);
                                    }
                                    selectedLink.LinkedFamilies.Add(SelectedFamilyInfo.TargetTypeId, SelectedFamilyInfo);

                                    var updated = MoverDataStorageUtil.UpdateLinkedFamilyInfo(SelectedFamilyInfo, tType);

                                    if (LinkInstances.ContainsKey(selectedLink.InstanceId))
                                    {
                                        LinkInstances.Remove(selectedLink.InstanceId);
                                        LinkInstances.Add(selectedLink.InstanceId, selectedLink);
                                    }
                                    trans.Commit();
                                    MappingWindowInstance.RefreshLinkInstance();
                                }
                                catch (Exception ex)
                                {
                                    trans.RollBack();
                                    var message = ex.Message;
                                }
                            }
                        }
                    }

                    FamilyWindowInstance.WakeUp();
                    break;

                case RequestId.DeleteFamilyMapping:
                    MappingWindowInstance.DozeOff();
                    if (null != SelectedFamilyInfo)
                    {
                        using (var trans = new Transaction(CurrentDocument))
                        {
                            trans.Start("Delete Family Map");
                            try
                            {
                                foreach (var familyInfo in LinkedFamilyToDelete)
                                {
                                    if (selectedLink.LinkedFamilies.ContainsKey(familyInfo.TargetTypeId))
                                    {
                                        selectedLink.LinkedFamilies.Remove(familyInfo.TargetTypeId);
                                        var tType = CurrentDocument.GetElement(familyInfo.TargetTypeId) as ElementType;
                                        if (null != tType)
                                        {
                                            var removed = MoverDataStorageUtil.RemoveLinkedFamilyInfo(tType);
                                        }
                                    }
                                }
                                trans.Commit();
                                if (LinkInstances.ContainsKey(selectedLink.InstanceId))
                                {
                                    LinkInstances.Remove(selectedLink.InstanceId);
                                    LinkInstances.Add(selectedLink.InstanceId, selectedLink);
                                }
                                MappingWindowInstance.RefreshLinkInstance();
                            }
                            catch (Exception ex)
                            {
                                trans.RollBack();
                                var message = ex.Message;
                            }
                        }
                    }
                    MappingWindowInstance.WakeUp();
                    break;

                case RequestId.None:
                    return;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Failed to execute external event handler.\n" + ex.Message, "Execute External Event Handler", MessageBoxButton.OK, MessageBoxImage.Warning);
            }
        }
예제 #16
0
        private bool PickMappingElements(out Element sourceElement /*in link*/, out Element targetElement /*in host*/)
        {
            var picked = false;

            sourceElement = null;
            targetElement = null;
            using (var trans = new Transaction(CurrentDocument))
            {
                trans.Start("Pick Mapping Elements");
                try
                {
                    var selection = m_app.ActiveUIDocument.Selection;
                    var reference = PickLinkedElement();
                    if (null != reference)
                    {
                        var linkedInstanceId = reference.ElementId;
                        if (LinkInstances.ContainsKey(linkedInstanceId) && reference.LinkedElementId != ElementId.InvalidElementId)
                        {
                            var lip       = LinkInstances[linkedInstanceId];
                            var linkedDoc = lip.LinkedDocument;

                            var linkedElement = linkedDoc.GetElement(reference.LinkedElementId); //element in linked model
                            if (null != linkedElement)
                            {
                                if (null != linkedElement.Category)
                                {
                                    var categoryId             = linkedElement.Category.Id;
                                    var categoryName           = linkedElement.Category.Name;
                                    ISelectionFilter selFilter = new TargetElementSelectionFilter(categoryId);
                                    var secondReference        = selection.PickObject(ObjectType.Element, "Pick a target item in the host model. The required category should be " + categoryName);
                                    if (null != secondReference)
                                    {
                                        var eId     = secondReference.ElementId;
                                        var element = CurrentDocument.GetElement(eId);
                                        if (null != element)
                                        {
                                            ElementTypeInfo sourceTypeInfo = null;
                                            var             sourceTypeId   = linkedElement.GetTypeId();
                                            var             sourceType     = linkedDoc.GetElement(sourceTypeId) as ElementType;
                                            if (null != sourceType)
                                            {
                                                sourceTypeInfo = new ElementTypeInfo(sourceType);
                                            }

                                            ElementTypeInfo targetTypeInfo = null;
                                            var             targetTypeId   = element.GetTypeId();
                                            var             targetType     = CurrentDocument.GetElement(targetTypeId) as ElementType;
                                            if (null != targetType)
                                            {
                                                targetTypeInfo = new ElementTypeInfo(targetType);
                                            }

                                            if (null != sourceTypeInfo && null != targetType)
                                            {
                                                sourceElement = linkedElement;
                                                targetElement = element;
                                                picked        = true;
                                            }
                                            else
                                            {
                                                var strBuilder = new StringBuilder();
                                                strBuilder.AppendLine("Source Family Name: " + sourceTypeInfo.FamilyName + ", Source Type Name: " + sourceTypeInfo.Name);
                                                strBuilder.AppendLine("Target Family Name: " + targetTypeInfo.FamilyName + ", Target Type Name: " + targetTypeInfo.Name);
                                                strBuilder.AppendLine("");
                                                strBuilder.AppendLine("Would you like to proceed with creating a map?");
                                                var result = MessageBox.Show(strBuilder.ToString(), "Mismatch Name", MessageBoxButton.YesNo, MessageBoxImage.Question);
                                                if (result == MessageBoxResult.Yes)
                                                {
                                                    sourceElement = linkedElement;
                                                    targetElement = element;
                                                    picked        = true;
                                                }
                                                else
                                                {
                                                    picked = false;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    if (picked && null != sourceElement && null != targetElement)
                    {
                        var linkInfo = new LinkedElementInfo(LinkType.ByMap, sourceElement, targetElement, selectedLink.InstanceId, selectedLink.TransformValue);
                        if (selectedLink.LinkedElements.ContainsKey(linkInfo.LinkedElementId))
                        {
                            selectedLink.LinkedElements.Remove(linkInfo.LinkedElementId);
                        }
                        selectedLink.LinkedElements.Add(linkInfo.LinkedElementId, linkInfo);

                        var updated = MoverDataStorageUtil.UpdateLinkedElementInfo(linkInfo, targetElement);
                    }

                    trans.Commit();
                }
                catch (Exception ex)
                {
                    trans.RollBack();
                    MessageBox.Show("Failed to pick mapping elements.\n" + ex.Message, "Pick Mapping Elements", MessageBoxButton.OK, MessageBoxImage.Warning);
                }
            }
            return(picked);
        }