明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1523|回复: 5

[界面] 图层管理面板

[复制链接]
发表于 2024-6-7 17:23:22 | 显示全部楼层 |阅读模式
本帖最后由 77077 于 2024-6-7 17:35 编辑

## 起因

    CAD图层管理面板的界面太过于庞大,操作起来有点点不方便,所以尝试做这样一个东东,请高手指正。

## 效果


## 源码发布
mainWindow.xaml

  1. <Window x:Class="AutoCAD_2014_图层管理器.mainWindow"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         ResizeMode="CanResizeWithGrip"
  5.         ShowInTaskbar="False"
  6.         Title="图层开关" Height="500" Width="150">
  7.     <Grid>
  8.         <Grid.RowDefinitions>
  9.             <RowDefinition Height="20"></RowDefinition>
  10.             <RowDefinition Height="*"></RowDefinition>
  11.         </Grid.RowDefinitions>
  12.         <TextBox x:Name="FilterElement" Grid.Row="0"/>
  13.         <ListBox x:Name="listBox1"
  14.                  ScrollViewer.VerticalScrollBarVisibility="Visible"
  15.                  Grid.Row="1"
  16.                  SelectionMode="Single"
  17.                  HorizontalContentAlignment="Stretch"  
  18.                  VerticalContentAlignment="Stretch"
  19.                  >
  20.             <ListBox.ItemTemplate>
  21.                 <DataTemplate>
  22.                     <StackPanel Orientation="Horizontal">
  23.                         <CheckBox IsChecked="{Binding IsOff}"/>
  24.                         <Rectangle Width="15" Height="15" Fill="{Binding LayerColor}" Stroke="#ff000000" StrokeThickness="1" />
  25.                         <TextBlock Text="{Binding LayerName}"/>
  26.                     </StackPanel>
  27.                 </DataTemplate>
  28.             </ListBox.ItemTemplate>
  29.         </ListBox>
  30.     </Grid>
  31. </Window>
复制代码


mainWindow.xaml.cs

  1. namespace AutoCAD_2014_图层管理器
  2. {
  3.     /// <summary>
  4.     /// mainWindow.xaml 的交互逻辑
  5.     /// </summary>
  6.     public partial class mainWindow : Window
  7.     {
  8.         public mainWindow()
  9.         {
  10.             InitializeComponent();

  11.             //初始化图层表
  12.             List<LayerColorName> list1 = new List<LayerColorName>();

  13.             // 获取当前图层名称,添加到图层表
  14.             using (Database data = HostApplicationServices.WorkingDatabase)
  15.             {
  16.                 using (Transaction trans = data.TransactionManager.StartTransaction())
  17.                 {
  18.                     using (LayerTable layer = (LayerTable)trans.GetObject(data.LayerTableId, OpenMode.ForRead))
  19.                     {
  20.                         foreach (ObjectId id in layer)
  21.                         {
  22.                             LayerTableRecord layer1 = (LayerTableRecord)trans.GetObject(id, OpenMode.ForRead);
  23.                             list1.Add(new LayerColorName(layer1.IsOff, ColorIndexConvertToHex(layer1.Color), layer1.Name));
  24.                         }
  25.                     }
  26.                     trans.Commit();
  27.                 }
  28.             }

  29.             //根据图层名称重新排序
  30.             List<LayerColorName> listsorted = list1.OrderBy(x => x.LayerName).ToList();
  31.             listBox1.ItemsSource = listsorted;
  32.         }

  33.         /// <summary>
  34.         /// CAD图层的索引色转16进制字符串
  35.         /// </summary>
  36.         /// <param name="color">CAD索引色</param>
  37.         /// <returns>16进制字符串</returns>
  38.         public static string ColorIndexConvertToHex(Autodesk.AutoCAD.Colors.Color colorIndex)
  39.         {
  40.             if (colorIndex.IsByAci)
  41.             {
  42.                 string hex = "#"
  43.                     + colorIndex.ColorValue.A.ToString("X2")
  44.                     + colorIndex.ColorValue.R.ToString("X2")
  45.                     + colorIndex.ColorValue.G.ToString("X2")
  46.                     + colorIndex.ColorValue.B.ToString("X2");
  47.                 return hex;
  48.             }
  49.             return "#FFFFFFFF";
  50.         }


  51.         /// <summary>
  52.         /// 定义一个{图层开关,图层颜色,图层名称}的类
  53.         /// </summary>
  54.         public class LayerColorName
  55.         {
  56.             public bool IsOff { get; set; }
  57.             public string LayerColor { get; set; }
  58.             public string LayerName { get; set; }

  59.             public LayerColorName(bool off, string col, string text)
  60.             {
  61.                 IsOff = off;
  62.                 LayerColor = col;
  63.                 LayerName = text;
  64.             }
  65.         }
  66.         //未完继续...
  67.     }
  68. }
## 下一步计划:
1.增加勾选关闭图层;
2.增加图层过滤;
3.判断图层名称前缀,做成双层列表(或者treeview),分组控制;



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-6-7 19:09:32 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2024-6-8 01:51 编辑

图层的状态应该是一个枚举,所以应该用二次方来表示.

名称应该才用一个排序结构,并且作为绑定.
例如SortDescription,这样可以在Add图层的时候自动加入到界面
 楼主| 发表于 2024-6-8 15:41:01 | 显示全部楼层
你有种再说一遍 发表于 2024-6-7 19:09
图层的状态应该是一个枚举,所以应该用二次方来表示.

名称应该才用一个排序结构,并且作为绑定.


那前缀相同的图层合并到一个子节点折叠显示和操作咋办?
比如说“DIM-”开头的图层合并到一个子节点,实现统一开关图层。
发表于 2024-6-8 17:03:10 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2024-6-8 17:49 编辑
77077 发表于 2024-6-8 15:41
那前缀相同的图层合并到一个子节点折叠显示和操作咋办?
比如说“DIM-”开头的图层合并到一个子节点, ...

只要是有序结构,就表示可以制造和命中索引,
因此"Dim-%"这样的搜索通常是两种方式:
一种是倒序索引,但是需要分词(不建议),
一种是前缀树(建议,问问豆包AI,能够直接给你一个代码)
前缀树实现WPF的绑定通知还是蛮方便的,
绑定通知是为了不用像你上面代码一样实现一次add数据到界面,一定要学会哦
 楼主| 发表于 2024-6-10 14:07:55 | 显示全部楼层
你有种再说一遍 发表于 2024-6-8 17:03
只要是有序结构,就表示可以制造和命中索引,
因此"Dim-%"这样的搜索通常是两种方式:
一种是倒序索引,但 ...

感谢指点,之前一直玩winform,有些思路还没转过来。
随着对wpf的深入了解,原来wpf还可以mvvm绑定这样玩,真是太省心了。
发表于 2024-7-7 13:12:27 来自手机 | 显示全部楼层
感谢作者的分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 03:42 , Processed in 0.149747 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表