77077 发表于 2019-2-21 15:11:00

根据卡恩的代码,写的一个图块预览。

做个标记备忘。// Helper function to generate an Image from a BitmapSource
      // 函数:从位图源生成190*120图像
      private static Image ImageSourceToGDI(BitmapSource src)
      {
            var ms = new MemoryStream();
            var encoder = new BmpBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(src));
            encoder.Save(ms);
            ms.Flush();
            return Image.FromStream(ms);
      }
1.界面
private void BlockPreviews2_Load(object sender, EventArgs e)
      {
            Database db = HostApplicationServices.WorkingDatabase;
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                //打开块表
                var bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
                var namelist = new List();//新建图块名称表
                ImageList imglist = new ImageList();//新建图块缩略图表
                imglist.ImageSize = new Size(190,120);// 图片尺寸分别是宽和高
                foreach (ObjectId blockRecordId in bt)//循环遍历块表中的块表记录
                {
                  var btr = (BlockTableRecord)trans.GetObject(blockRecordId, OpenMode.ForRead);//打开块表记录对象
                  if (!btr.IsAnonymous && !btr.IsLayout)//在下拉列表框中只加入非匿名块和非布局块的名称
                  {
                        namelist.Add(btr.Name);//添加到图块名称表
                        imglist.Images.Add(ImageSourceToGDI(CMLContentSearchPreviews.GetBlockTRThumbnail(btr) as BitmapSource));//添加到图块缩略图表
                  }
                }
                listView1.View = View.LargeIcon;//设置为大图标视图
                listView1.MultiSelect = false; //只能单选
                listView1.LargeImageList = imglist;// 这里设置listView的SmallImageList ,用imgList将其撑大
                for (int i = 0; i < imglist.Images.Count; i++)
                {
                  var lvi = new ListViewItem();//新建ListViewItem
                  lvi.ImageIndex = i;//取出图片
                  lvi.Text = namelist;//取出图块名称
                  listView1.Items.Add(lvi);//添加到listView1
                }
            }
      }
2.获取选中项
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
      {
            if (listView1.FocusedItem != null) //这个if必须的,不然会得到值但会报错
            {
                textBox1.Text = "当前选中的是:" + listView1.FocusedItem.SubItems.Text;//获得的listView的值显示在文本框里
            }
      }

8142556 发表于 2019-4-30 15:54:00

不错,很好的方法

8142556 发表于 2019-4-30 15:59:00

就是速度有点慢

foer123 发表于 2020-5-29 16:14:00

这个是什么语音写法的CAD插件
页: [1]
查看完整版本: 根据卡恩的代码,写的一个图块预览。