AutoCAD批量插入块

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AutoCAD批量插入块相关的知识,希望对你有一定的参考价值。

参考技术A 16年年底实习时的发现的小操作,在这里整理下思路。

CAD的插入块功能不能同时插入多个dwg,当时经常要进行这个操作,遇到几十个dwg要插入时会比较麻烦,而且可能会漏插。当时百度了一会,没找到特别直接的办法,倒是看到了cad脚本的东西,自己摸索了下,可行。

现有4个dwg文件需要合并,如图1,它们 均在 cad默认坐标系中创建,通过插入块操作(如图2设置)合并的结果如图3。

执行 *.scr 脚本后cad做的事情:

1、打开第一个文件:1.dwg

2、依次插入2.dwg、3.dwg和4.dwg,并全局显示

3、将合并后文件另存到同一文件夹中( 命名为charu.dwg )

**值得注意的是,3、4行前面是有一个空格的,这应该是代表3、4行是重复执行2行的命令(insert)

除此以外,6行最后是有一个空格的,这个空格应该代表在另存为文件时按下确定,其他行的最后均没有空格**

*这些空格应该都代表键盘空格键,我是根据命令行的提示经过多次尝试摸索出来的,多一个不行,少一个也不行。不过,最后一行其实是可以放在5行后面,用一个空格隔开。虽然不太明确空格键的用法,但是根据命令窗口的提示去验证就行了*

实际上 调用脚本就相当于在命令行输入命令来控制cad,只是由于操作重复性高,这些脚本是可以自动生成的,相当于批量输入cad的命令,具体就是在dwg文件完整路径左右两边加上相应的命令,当时我是用excel的vba加上windows的批处理来实现脚本的自动生成的,也是由于百度vba的知识来到了,别看首页鸡汤多,干货还是不少的,而且界面还挺好看。

当时我需要将多组的dwg通过插入块的方式分别合并成多个文件,帮上忙的除了cad脚本,还有就是excel的 vba 了,vba的应用使我能够一次性生成大量的cad脚本,省去了很多麻烦,假如不能自动生成这些脚本,那么就不能叫批量插入了,还不如一个个地插入。所以接下来还要回忆一下vba的内容。

excel vba............

JPA 批量插入(如果不存在)

【中文标题】JPA 批量插入(如果不存在)【英文标题】:JPA bulk insert if not exists 【发布时间】:2013-03-03 10:42:32 【问题描述】:

我有 3 个实体 - Player、Hand 和 PlayerHandStats。前两个是常规表,ID 为 PK。另一方面,PlayerHandStats 有一个复合 PK (player_id, hand_id)。它们一起形成了某种“包”,这就是我试图将它们保持在一个块中的原因。 ParsedHand 只是一个捆绑实体的类 - 它包含 1 Hand、2..10 Player 和 2..10 PlayerHandStats。以下是我目前的幼稚方法,它并没有真正起作用。

public static void persist(ParsedHand parsedHand) 
    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();

    em.persist(parsedHand.getHand());

    Collection<Player> players = parsedHand.getPlayers().values();
    for (Player player : players) 
        em.persist(player);
    

    Collection<PlayerHandStats> stats = parsedHand.getStats().values();
    for (PlayerHandStats phs : stats) 
        em.persist(stats);
    

    em.getTransaction().commit();
    em.close();

问题是,特定的 Player 实体可能已经存在于 DB 中 - 在这种情况下,整个过程将终止。我想继续它,不对实体执行任何合并或更新,而是检索它的 ID(因为在应用程序级别它没有分配 ID)。

简单示例(注意:NAME 和 POKER_SITE 列形成一个唯一约束):

ID  |NAME        |POKER_SITE
----+------------+------------
0   |neverlimp92 |PokerStars
1   |player01    |PokerStars

现在,假设我在应用程序级别有一个 Player 实体,其中包含字段(null、'neverlimp92'、'PokerStars')。显然,它会返回java.sql.SQLIntegrityConstraintViolationException,整个过程终止。我怎样才能避免这种情况?我应该重写 hashCode() 和 equals() 方法,并执行

for (Player player : playes) 
    if (!em.contains(player)) 
        em.persist(player);
    

考虑到可能有 10k 行,甚至 100k 行,我不确定这是否明智。

此外,如果实体确实存在,那么在应用程序级别检索其 ID 并将其分配给现有实例的正确方法是什么?

我对 JPA 的经验很少,非常感谢任何形式的帮助,或者指出我正确的方向。谢谢。

【问题讨论】:

【参考方案1】:

如果玩家可能是现有玩家,那么对于每个玩家,您需要在数据库中查询具有该名称和站点的玩家,如果存在则使用它,如果不存在则保留它。

这取决于他们是这样一个玩家的可能性有多大。如果不太可能,那么您可以将其持久化,如果提交失败,则使用第二种算法重试。

一般来说,如果你的播放器有它的 id 会更好,然后你就会知道它是新的还是现有的。

【讨论】:

以上是关于AutoCAD批量插入块的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis批量插入为什么比单条插入块?

autocad软件dwg文件作为块插入时是以啥作为基点的

如何使用 Sequelize 和 node.js 进行批量插入

JPA 批量插入(如果不存在)

为啥批量插入/更新更快?批量更新如何工作?

批量插入数据