PDF页面倒序

今天遇到一个问题,把项目资料扫描电子版归档,扫描完后发现某个资料排序是从最新到最旧,想着如何倒序排列。尝试了几个常用的PDF阅读器,没发现类似的功能,于是尝试用python来实现。

import fitz  # PyMuPDF
import os
#定义函数
def reverse_pdf_order(input_pdf_path, output_pdf_path):
    source_pdf = fitz.open(input_pdf_path)  # 打开pdf
    reversed_pdf = fitz.open()  # 新建pdf

    # Iterate through the pages in reverse order
    for page_number in range(source_pdf.page_count - 1, -1, -1):
        # 插入页面
        reversed_pdf.insert_pdf(source_pdf, from_page=page_number, to_page=page_number)

    reversed_pdf.save(output_pdf_path)  # 保存生成的pdf
    source_pdf.close()  # 关闭输入pdf
    reversed_pdf.close()  # 关闭生成的pdf

folder = 'd:/Desktop/' #指定工作目录
os.chdir(folder)       #切换到工作目录
input = 'input.pdf'    #需要调整页面顺序的文件
reverse_pdf_order(input, 'reversed_' + input) #生成文件

当然,可以改造代码批量转换,就不多说了。

Homeassistant通过ILO RESTful API控制hp server开关

自从使用home assistant系统后,逐步将家中各种设备接入。先是窗帘、灯、空气净化器、空调等智能家居设备接入后,然后发现truenas、ILO、openwrt等设备也可以接入并控制。

根据老婆大人的指示,家里用电已经达到三阶了,要求我省电,服务器能关就关。为了响应老婆大人的号召,先是研究了truenas接入HA。

HACS安装Truenas插件,添加integration,配置ip,用户名和密码即可。最后可以通过call service即可完成Truenas的关闭。

前面的研究很顺利,但是如何自动开机就麻烦了。Truenas插件肯定不行,因为关机状态根本就不会运行,只能另想办法。

HP的server通过ILO可以控制开关机,因此研究接入ilo的方案。显示研究默认的ilo integration,发现只能监控服务器的状态。

后转而研究通过ssh连接ilo,发现那是多年前的帖子,ssh更新后,由于ilo的验证方式问题已经失效。

最后,发现还可以通过ilo的RESTful API进行控制,然后发现刚才的帖子最后竟然有人贴出了解决方案。这就教育我们看文章一定要看到最后!

先是两篇参考:

iLO 4 API: iLO RESTful API Data Model Reference (iLO 4) 5

RESTful Command: RESTful Command – Home Assistant 2

代码如下:

#RestAPI iLO start server
rest_command:
  server_poweron:
    url: "https://<IPADDRESS>/rest/v1/systems/1"
    method: POST
    headers:
      accept: "application/json"
    payload: '{"Action":"Reset","ResetType":"On"}'
    content_type:  'application/json; charset=utf-8'
    username: apiuser
    password: apipassword
    verify_ssl: false

在config.yaml中加入以上代码,重启后,调用restful api即可,也可以写成script,按时自动运行。可以按需调整代码,比如ResetType,可以改为ForceOff等。

Pixel 6 pro

2022年12月的更新导致adb解锁的漏洞被封堵。之前已经解锁的可以升级,正常使用,但是不可以重置手机。重置之后,即无法解锁。

各位Google原生系统爱好者一定要注意,确认无锁版是否真的无锁,还是adb解锁。否则只能当个touch,玩系统,不能用来打电话。

批量汇总多个dwg文件的材料标准并汇总成物料表

以下为代码,并都进行了标注。

# 导入必要的包
import pyautocad as pc
import numpy as np
from pathlib import Path
import win32com.client
import pythoncom
import time
import pandas as pd
import subprocess
#定义函数
def material_extraction(file_path):
    dwg_files = Path(file_path).glob('*.dwg') #获取所有dwg文件
    material_dict = {} #创建空字典
    for dwg_file in dwg_files: #遍历所有dwg文件
        acad= win32com.client.gencache.EnsureDispatch("AutoCAD.Application") #调用AutoCAD
        print(f'Openning {dwg_file}') #打印打开的文件名
        doc2 = acad.Documents.Open(dwg_file) #打开cad文件
        time.sleep(5) #休眠5秒钟,避免打开时间过长
        model = doc2.ModelSpace #获取模型空间
        pyacad = pc.Autocad(create_if_not_exists = True) #创建一个新的pyautocad对象
        model_space = pyacad.model #获取模型空间
        uptext = [] #创建空列表
        try: #尝试执行下面的代码
            for obj in pyacad.iter_objects_fast('TDbSymbMultiLeader',container=model_space): #遍历模型空间中的所有TDbSymbMultiLeader对象
                uptext.append(obj.uptext) #将uptext属性添加到uptext列表中
            material_dict[doc2.Name] = tuple(set(uptext)) #将文件名作为key,uptext列表作为value,添加到material_dict字典中
        except: #如果上面的代码执行失败,执行下面的代码
            print(f'{dwg_file}  failed') #打印失败的文件名
        doc2.Close() #关闭文件
    df = pd.DataFrame.from_dict(material_dict,orient='index').T #将material_dict字典转换为DataFrame对象
    df.to_csv(Path(file_path)/'物料表.csv',encoding='gb2312') #将DataFrame对象转换为csv文件
    print(f'打开项目文件夹:{file_path}') #打印打开的文件路径
    subprocess.Popen(f'explorer {file_path}') #打开文件路径
file_path = Path.cwd() #设置文件路径
material_extraction(file_path) #调用函数

我要忽悠大家学Python了

近年来,各种培训机构、公众号,都在呼吁大家学python,演示了各种花哨的功能,看着都很高大上的样子,然并卵,跟我们实际工作没有太大的关系。

        本人学Python很长时间了,主要用于处理GIS数据,自动化航拍处理流程,研究深度学习这些工作,虽然是未来设计的必然趋势,但是跟我们目前的日常工作关系也不大,因此就没有忽悠大家学Python。

        不过近期通过Python解决了一些我们日常工作的小问题,想拿出来聊聊,做成一个系列的文章,看看能否把大家忽悠瘸了。

        今天先拿一个很简单的案例来忽悠:

        项目做到一半,来了一版新的测绘图,发现标高变了,统一抬高或者降低了一定的高程,怎么办?总平竖向都定好了,标注了几百个标高,让我怎么改?查找替换?能实现增加前缀后缀这些,但是实现不了数字加减一定的值。

        相信很多人遇到过类似的问题,怎么解决?Python。

        用PyAutocad包即可实现这一目的,下面是代码:

#导入包,创建autocad实例
from pyautocad import Autocad,APoint
acad = Autocad(create_if_not_exists = True)
acad.prompt('Hello,Autocad from Python\n')
#循环所有天正标高,所有标高数字都增加10000
for obj in acad.iter_objects('TDbSymbElevation'):
    t = obj.Text
    if t.endswith('&%%P0.000'):
        obj.Text = obj.Text.replace('&%%P0.000','')
    if t.endswith('.'):
        obj.Text = obj.Text.replace('.','')
    obj.Text = str(float(obj.Text) + 10000)

        运行,效果如下:

        So easy,你会读了么?

补充:在本文发布后,有好多小伙伴发来消息,整理如下:

1、通过动态标注,移动所有标高,即可调整标高数值,何苦还要写代码?

回复:这就跟那个段子一个道理:如何检查空箱子?博士研究各种探测装置,工人用大风扇吹。貌似用风扇简单省事,研究探测装置纯粹浪费,但是一旦条件发生变化,简单的方法就会失效了,而高科技探测装置调整一下参数还可以达到目的。比如,检查的不是空箱子,而是没装满的箱子,你的大风扇还能吹走么?

具体到这个案例来,就是我们景观设计的标高往往习惯标注一些前缀:TW(Top of wall,墙顶标高),FL(Finish Level,完成面标高),你试试有了这些前缀后,你再开启动态标准,移动标高标注还有用么?这段代码我可以再增加个判断,先拆离前缀,最后在组合起来就可以了,能够根据需求,完成各种复杂的操作。

2、能否只局部抬高或者降低?

回复:可以的,有get.selection(),可以只对选中的部分进行操作。调整代码封装为函数,可以很方便的调整高程的增量,快速应用到不同的区域。

3、那么快做完 ,下面的人画什么呢?

回复:写代码只是解决简单重复的劳动,需要创意的工作还是要靠人来进行,因此不会影响设计师的成长。相反,从简单重复的劳动中解脱出来,更多的世界来思考设计,更有利于设计师的成长。

图纸集管理器内容空白

User-added image
图纸集内容空白

原因:

  • 图纸集dst文件损坏。
  • 注册表管理器键值缺失。

解决方法:

  • 在其它电脑尝试打开此dst文件,如果都无法显示内容,请重建dst文件。
  • 如果其它电脑显示正常,则大概率是注册表的问题,检查下图所示键值。
User-added image

如果确认这里为空,双击运行附件中对应cad版本的reg文件,即可解决本问题。

引自:https://knowledge.autodesk.com/support/autocad/troubleshooting/caas/sfdcarticles/sfdcarticles/Sheet-Set-Manager-shows-up-blank-in-AutoCAD.html

Geoserver的cors

Cesium与geoserver不是一个服务器上运行的时候,跨域问题就出现了。

解决这个问题很简单:修改geoserver\webapps\geoserver\WEB-INF\web.xml文件。

根据服务的方式修改对应部分,tomcat或者jetty,

最后记得把这个也取消注释就可以了。

CQL语言转义字符

近日在研究Geoserver,学到Cross-layer filtering,在看教程的时候某个功能反复尝试没有通过,

如上图,查询与区域类型为A的汇水区相交的区域,反复检查大小写,半角等,尝试用python的转义符\等操作均告以失败,最总发现,CQL的转义是通过重复实现的,也就是 ‘zone = ”A”’,A两侧不是双引号,而是两个单引号重复而来。

宏岚景观数字化平台简介

北京宏岚景观设计有限公司成立于2016年,是一家专业的景观设计机构,由数名来自一线设计公司、具有多年工作经验的设计师联合创立,可以在景观设计,项目勘察,庭院设计等领域提供优质的服务。

公司经营范围:工程勘察设计,景观设计,模型设计,以及技术咨询。

另外,BIM咨询、无人机航拍、GIS、数字化景观服务也是本公司的一大特色。并成为ESRI公司的合作伙伴,致力于将GIS技术引入景观设计中来。

为了普及景观的新技术,降低使用门槛,现推出了宏岚景观数字化平台,综合运用多种新技术,将景观设计的各类数据进行了整合,能大幅降低整个中的沟通成本,同时也能提高设计的科学性,便于最终项目落地。

开始动画效果,类似GoogleEarth,逐渐放大到项目范围。

我们将项目的各类数据整理到本平台中:

  • 通用的数据:包括各位卫片、地图,后期还会增加一些其它网上公开的数据:如机场禁飞区、名胜古迹、森林公园、用地类型等等。
  • 项目数据:
    • 测绘图纸定位:高程点及等高线可以用于生成测绘地形,居民点图层可用生成建筑体块,水系、管线、道路等等也都可以直接落到场景中直观进行展示。
    • 平面图定位:航测正射影像、手绘平面图、彩色平面图等。
    • 照片定位:现场照片,效果图,全景照片等。
    • 模型定位:航测三维模型、设计su模型、屋外家具单体模型等。

通过将以上的数据进行整合,我们可以有多种玩法:

  • 概念方案阶段:刚接到项目,只有业主提供的一些基础资料,之前我们都是对照着cad图,凭经验判断现场的情况,然后开始做设计。现在我们直接生成三维场景来查看,虽然比较粗糙,但是比凭经验判断,难度及准确度还是提高了一个等级的。
  • 深化方案阶段:
    • 通过航拍模型可以清晰的了解现场情况。
  • 如有遮挡,或者需要更高精度的查看细节,可以把照片定位,便于查看。
  • 施工图阶段:业主提供的测绘图纸有的老旧不符合现状,有的由于地形复杂,很多区域人不能进入而缺少数据,通过倾斜摄影模型,我们可以很方便的测量两点之间的水平及垂直距离,可以及时发现方案与现状有冲突的地方,及时沟通解决。
  • 指导施工阶段:
    • 施工现场发现设计不合理的时候,可以直接截图倾斜摄影模型,沟通效率会极大的提升。避免了文字描述导致会错意,减少无效沟通。
    • 施工过程中的重要阶段,再次进行航拍,将施工过程现状与施工图进行对比展示,发现问题,解决问题。
  • 竣工验收阶段:
    • 施工完成后,可以通过航拍,辅助绘制竣工图。过程中的变更、问题也都可以定位。
    • 对于美丽乡村或者其它建筑立面改造项目,可以方便的查看、测量建筑立面,辅助竣工图绘制及工作量统计。
    • 项目展示:项目进行前后对比,项目最终的倾斜摄影模型等等。

目前宏岚景观数字化平台还是一个初级的版本,主要是整合数据进行展示,后面还会增加景观常用的科学分析的功能,诸如地形分析、可视性分析、日照分析、区位分析、周边业态分析等,使其成为一个功能完善的景观专业设计管理平台。

在此欢迎各位景观界同仁测试,并不吝提出宝贵的意见建议,我们会不断的进行完善。如果各位有项目需要使用这个平台,也欢迎来电咨询,可以根据需求进行定制开发。

访问地址:宏岚景观数字化平台

Windows 10 如何顺利安装AutoCAD 2015及以前版本

本人一直推荐安装使用天正能够支持的最新的AutoCAD版本,本文成文的时候我的版本为AutoCAD 2020+天正T20 V7。新版会解决很多已知问题,增加人性化的功能,建议保持更新。

但是近期由于需要运行一个旧版本cad才能使用的插件,必须安装AutoCAD 2014,安装完之后可以正常打开,激活,但是随便点一下ribbon或者其他设置,就会崩溃。

通过一番搜索,初步解决了这个问题,并分享出来:

  • 原因:
    1. Windows 10 是AutoCAD 2015以后才推出的,因此2015之前的AutoCAD版本不在Windows的支持之列。这个不在支持不是完全不能用,而是很可能存在bug,而且后期也不太可能修复。
    2. 安装了Microsoft .NET Framework 4.7 及更新版本,导致不兼容。理论上可以降级,但是会导致其他软件出问题。
  • 解决方案:
    1. 用记事本或者其他文本编辑工具打开‘C:\Program Files\Autodesk\AutoCAD 20xx\acad.exe.config’,这个文件。
    2. ‘<AppContextSwitchOverrides value=”Switch.System.Windows.Input.Stylus.DisableStylusAndTouchSupport=true”/>’,将前面这行代码复制到其中的<runtime></runtime>之间。
    3. 保存,关闭。重启AutoCAD即可。
    4. 针对AutoCAD 2014的样板文件放在后面供下载。
  • 备注:
    • 以上操作只能解决崩溃的问题。
    • 如有其他问题可以搭配兼容性模式之类进行调整。
    • 还是建议升级新版软件。