浅说 INSERT/块参照/BlockReference

news2024/9/23 11:23:40

在AutoCAD中使用INSERT命令插入一个块时,生成块参照实体,也叫INSERT实体,在ObjectARX中,对应类AcDbBlockReference。反正就这么一个东西,名儿还挺多,我家乡有句话叫“二嫚她婆婆俩名”,莫非这是三嫚儿?

之所以是浅说,是因为我对块的认识还处在初级阶段。我不用AutoCAD画图,自然也用不到块。前面也说过,我解析DWG的初衷就是为了读出相关图元。在达到我的目的之后,出于兴趣,有时间继续研究一下其他内容的读取。块在AutoCAD中的应用是十分广泛的,尤其是动态块的诞生,让块的地位又提升了一个台阶。有朋友私信我有没有解读动态块的内容,当时吧,对这方面的知识掌握不多,自然就 。。。。呵呵了。

块有2种,普通块和动态块。普通块,大家应该很熟悉,定义好块,插入到某个布局中,就成了块参照。对块参照能做的无非就是缩放旋转等常规操作,块内的图形是不能再被编辑的。动态块也是像普通快一样插入,缩放旋转的常规操作自然也是具备的,但是,它的超能力来自于,我们可以修改参照内的图形。

听起来,还是蛮简单的,但是,动态块的内容十分庞大。其实,动态块不应该当做图块来看,定义一个动态块,就是定义了一段程序,在程序的辅助下,我们才能实现复杂的修改。

按照Autodesk的说法,动态块是基于DAG的一套求解器。DAG就是有向无环图(Directed Acycle Graph),这个图是由node和edge构成的一个网络。node代表动作,edge是对象属性之间的依赖关系,并且edge是有方向的。具体的,咱就不多讲了,也讲不清楚,哈哈,知道有这么回事就行。

好了,现在该是去探究一下动态块的存储了。在解析DWG文件时,并没有所谓的动态块图元类型。我们知道,对象扩展字典是一个很强大的工具,二次开发者可以借助该字典对元对象实现无限扩展,动态块可以认为是Autodesk假装自己是第三方开发者对普通块进行扩展的极好示范。借助扩展字典,就无需对DWG格式做任何修改。据说动态块是2006版引入的功能,而2006版使用的DWG格式和2004是一样的。

闲话打住,探究之旅正式起航。

首先创建一个动态块BB1,由4跟直线组成,其中加入了点、线性2个参数,以及2个拉伸动作。
在这里插入图片描述
去除了不相关的部分,该块描述如下:

Object(BLOCK_HEADER/31)
handle: 0.1.F1
owner: 4.1.1
xdicobjhandle: 3.2.5BF
name: *U
entries:4
inserts:2
1), 3.2.5BB
2), 3.2.5BC
3), 3.2.5BD
4), 3.2.5BE
block:3.1.F2
endblk:3.1.F3
Object(BLOCK/4)
handle: 0.1.F2
owner: 4.0.F1
xdicobjhandle: 0.0.0
name: BB1
Object(LINE/13)
handle: 0.2.5BB
owner: 4.1.F1
start: 0.000000, 0.000000, 0.000000
end  : 36.067069, 49.732573, 0.000000

------------
Object(LINE/13)
handle: 0.2.5BC
owner: 4.1.F1
start: 36.067069, 49.732573, 0.000000
end  : 69.634529, 29.107227, 0.000000

------------
Object(LINE/13)
handle: 0.2.5BD
owner: 4.1.F1
start: 44.258738, 7.308900, 0.000000
end  : 69.634529, 29.107227, 0.000000

------------
Object(LINE/13)
handle: 0.2.5BE
owner: 4.1.F1
start: 44.258738, 7.308900, 0.000000
end  : 0.000000, 0.000000, 0.000000

然后,在模型空间插入此块,只调整了比例。可以看出,参照的块名是"BB1"。
在这里插入图片描述
这时,我们再到解析的数据里找句柄为669的块参照,看看它的数据,注意看它引用的块的句柄,正是我们刚定义的动态块BB1的句柄)

Object(INSERT/7)
handle: 0.2.669
owner: 0.0.0
xdicobjhandle: 0.0.0
entmode: 2 (MSPACE)
insert point: (989.208137, -530.611402)
block header: 5.1.F1

就是说,未对块参照执行动态调整时,它是直接引用原始的块定义的,并且没有扩展字典。

我们使用动态参数来调整一下,形状明显与上面的不同。
在这里插入图片描述

保存DWG,再解析一遍,查看669的数据。

Object(INSERT/7)
handle: 0.2.669
owner: 0.0.0
xdicobjhandle: 3.2.6BC
entmode: 2 (MSPACE)
insert point: (989.208137, -530.611402)
block header: 5.2.6B4

看到没,这时引用的块定义变成 6B4 了,而且有扩展字典。

我们再看看块 6B4 是咋个样子。

Object(BLOCK_HEADER/31)
handle: 0.2.6B4
owner: 4.1.1
xdicobjhandle: 3.2.6BB
name: *U
entries:4
inserts:1
1), 3.2.6B7
2), 3.2.6B8
3), 3.2.6B9
4), 3.2.6BA
block:3.2.6B5
endblk:3.2.6B6
Object(BLOCK/4)
handle: 0.2.6B5
owner: 4.0.6B4
xdicobjhandle: 0.0.0
name: *U25
Object(LINE/13)
handle: 0.2.6B7
owner: 4.0.6B4
start: 0.000000, 0.000000, 0.000000
end  : 36.067069, 49.732573, 0.000000
------------
Object(LINE/13)
handle: 0.2.6B8
owner: 4.0.6B4
start: 36.067069, 49.732573, 0.000000
end  : 53.107381, 39.262245, 0.000000
------------
Object(LINE/13)
handle: 0.2.6B9
owner: 4.0.6B4
start: 44.258738, -7.308900, 0.000000
end  : 53.107381, 39.262245, 0.000000
------------
Object(LINE/13)
handle: 0.2.6BA
owner: 4.0.6B4
start: 44.258738, -7.308900, 0.000000
end  : 0.000000, 0.000000, 0.000000

块 “*U25” 中的4条直线 6B7,6B8,6B9,6BA分别对应 块"BB1"中的 5BB,5BC,5BD和5BE,由于做了参数调整,他们的坐标值发生了变化。

这一切说明了什么呢?
当我们使用动态块时,99.99999%的概率是要对它修改的,所以:

插入动态块后,AutoCAD会复刻一份原始动态块的定义,生成一个匿名动态块,作为块参照的引用块。所有对块参照的修改,都反映在这个匿名块身上,而后,像使用普通块一样使用这个匿名块。

这样做,可以保证原始的动态块定义永远保持不变。当然,这是在你不人为修改它的定义的前提下。如果你参照它生成多个块参照对象后,再修改它的定义,AutoCAD总会询问你,是否更新这些块参照,还记得这个画面吗?
在这里插入图片描述
到这里,可以更新开头我对动态块的解读认知了。

解析INSERT图元,如果要生成图形,直接使用其参考的块包含的对象就可以了,不用分辨它是动态块还是普通块,动态调整的过程AutoCAD已经帮我们完成了。

起初,我还以为,生成动态块的参照,需要从参数,动作等自己去完成,那对大多数人来说都是不可能完成的任务,好在AutoCAD保存了块参照参考的匿名块的最后状态,而不是仅仅保存该状态的自定义参数值,不过想想也是,它不保存不是难为自己吗?是我想的复杂了。

没有时间去比对原始动态块和新的匿名块,他们的扩展字典的情况了,不影响大局,那是APP(这里是AutoCAD)要关心的事。

写这些,只是想作为这几天研究动态块的一个笔记。

好了,结束本篇,春节临近,祝春节快乐。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构(5) treap

活动 - AcWing 参考—《算法竞赛进阶指南》-lyd 目录 一、概述 二、具体操作详解 1.常见操作 2.结构定义 3.操作基础函数 (1)pushup (2) 获得一个新节点 (3)左旋右旋 (4)建…

centos上面用docker 安装nacos 1.4.1

方式一: 下载nacos本地文件 1. 去官网下载GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.2.上传到Linux服务器中cd /usr/uploadtar -zxvf nacos-serv…

二、QML工程之初始工程代码分析

接着上一讲&#xff0c;当建立完工程之后&#xff0c;IDE 会呈现如下的界面下面的代码是main.cpp&#xff0c;工程起始运行的代码段&#xff0c;具体的函数说明都在代码段里面进行了标注。#include <QGuiApplication> //主要是ui进程运行头函数&#xff0c;包含事件循环&…

【云原生】k8s图形化管理工具之rancher

内容预知 前言 1. Rancher的相关知识 1.1 Rancher的简介 1.2 Rancher与k8s的关系及区别 1.3 Rancher具有的优势 2. Rancher的安装部署 2.1 实验环境与部署图分配 2.2 具体的部署操作 &#xff08;1&#xff09;在 rancher 节点下载 rancher 镜像 &#xff08;2&#xff…

【Spring(七)】详细了解Spring的核心容器

文章目录前言容器总结前言 前面我们完成bean以及依赖注入的相关学习&#xff0c;现在我们进入到核心容器的最后一块内容了&#xff0c;也就是与容器相关操作的学习&#x1f388;&#x1f388;。 容器 前边我们获取容器是这样获取的&#x1f447;&#x1f447;。 这只是获取容器…

Vue CLI脚手架

1、Vue的开发模式 目前我们使用vue的过程都是在html文件中&#xff0c;通过template编写自己的模板、脚本逻辑、样式等。 但是随着项目越来越复杂&#xff0c;我们会采用组件化的方式来进行开发&#xff1a; 这就意味着每个组件都会有自己的模板、脚本逻辑、样式等&#xff…

凌恩生物报告升级,科研美图助力群落互作机制研究

2022年&#xff0c;在多位技术支持与生信工程师的通力合作下凌恩生物报告升级重磅升级&#xff01;扩增子分析流程项目从60到120&#xff0c;可谓是加量不加价的超值更新了&#xff01;结题报告的结果图片可直接用于文章发表&#xff0c;快一起来看看&#xff01;小小的举个例子…

pytorch【Conv2d参数介绍】

def __init__(self,in_channels: int,out_channels: int,kernel_size: _size_2_t,stride: _size_2_t 1,padding: _size_2_t 0,dilation: _size_2_t 1,groups: int 1,bias: bool True,padding_mode: str zeros # TODO: refine this type):in_channels&#xff1a;网络输入…

《Linux性能优化实战》学习笔记 Day03

04 | 零拷贝&#xff1a;如何高效地传输文件&#xff1f; 原文摘抄 文件拷贝 上下文切换的成本并不小&#xff0c;虽然一次切换仅消耗几十纳秒到几微秒&#xff0c;但高并发服务会放大这类时间的消耗。 每周期中的 4 次内存拷贝&#xff0c;其中与物理设备相关的 2 次拷贝是…

再学C语言37:函数、数组和指针

编写一个对数组进行操作的函数&#xff0c;并进行调用 一般形式举例&#xff1a; int sum(int * arr, int n); // 函数原型// 第一个参数把数组地址和类型信息传递给函数// 第二个参数把数组中元素的个数传递给函数int main(void) {...int total;total sum(array_t, 10);...…

分分钟你也能写一个自己需要的 Chrome 扩展程序

废话 对于chrome浏览器想必大家大不陌生了&#xff0c;里面的扩展程序&#xff08;本文后面称插件&#xff09;&#xff0c;多多少少也都用过吧&#xff0c;毕竟可以辅助自己的日常工作&#xff0c;娱乐等等&#xff0c;添加完之后呢&#xff0c;就会多出一些操作按钮&#xf…

年度总结-你觉得什么叫生活?

陈老老老板&#x1f9b8;&#x1f468;‍&#x1f4bb;本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09;&#x1f468;‍&#x1f4bb;本文简述&#xff1a;生活就像海洋,只有意志坚强的人,才能到达彼岸。&#x1f468;‍&#x1f4bb;上一篇文章…

Linux常用命令——tr命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tr 将字符进行替换压缩和删除 补充说明 tr命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符&#xff0c;经常用来编写优美的单行命令&#xff0c;作用很强大。 语法 tr(选…

云逗猫——直播弹幕控制机械臂逗猫棒

这个东西思路是很简单的。简单来说在直播画面用文字跟观看者约定一些弹幕指令&#xff0c;然后用爬虫爬取直播弹幕&#xff0c;当爬到弹幕是约定的指令时&#xff0c;通过串口给舵机控制板发送信号&#xff0c;控制板控制舵机转动&#xff0c;机械臂就会做相应的动作。 猫 两…

Lesson2无头单向非循环链表(中)

1.链表 1.1链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 1.2链表的分类 实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 1.…

【SAP Hana】X档案:SAP HANA 数据库基础知识

SAP HANA 数据库基础知识1、基本规则&#xff08;1&#xff09;注释&#xff08;2&#xff09;标识符&#xff08;3&#xff09;引号&#xff08;4&#xff09;保留字2、数据类型&#xff08;1&#xff09;日期时间类型&#xff08;2&#xff09;数字类型&#xff08;3&#xf…

SNMP简单网络管理协议

随着网络的规模越来越庞大&#xff0c;网络中的设备种类繁多&#xff0c;如何对越来越复杂的网络进行有效的管理&#xff0c;从而提供高质量的网络服务&#xff0c;已成为网络管理所面临的巨大挑战。网络的管理和运维手段多样&#xff0c;下面将对几种常见的网管与运维手段展开…

[leetcode.29]两数相除,位运算虽好,不要满眼是她

题目如下 不允许用乘除法&#xff0c;但是我们可以用加减法和位运算。。。不过这里不要用位运算&#xff0c;比如说你要是想用补码交替除法&#xff0c;你根本无法获得移动几位&#xff08;移动31位&#xff1f;太鬼畜了吧&#xff09; 所以说单纯的除法部分&#xff0c;我们可…

测试开发 | 实战演练基于加密接口测试测试用例设计

image1080594 76.4 KB 如果接口测试仅仅只是掌握一些requests或者其他一些功能强大的库的用法&#xff0c;是远远不够的&#xff0c;还需要具有根据公司的业务以及需求去定制化一个接口自动化测试框架能力。所以在这个部分&#xff0c;会主要介绍接口测试用例分析以及通用的流程…

从零开始 verilog 以太网交换机(二)MAC接收控制器的设计与实现

从零开始 verilog 以太网交换机&#xff08;二&#xff09;MAC接收控制器的设计与实现 &#x1f508;声明&#xff1a; &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN主页 &#x1f9e8; 从零开始 verilog 以太网交换机系列专栏&#xff1a;点击这里 &#x1f511;未经作者允…