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]; }
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); }
/// <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(); } }
/// <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); }
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}"); }
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); }
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); }
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}"); }
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); }
/// <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]; }
/// <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; } } }
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); } }
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); }