winprop二次开发

winprop二次开发

  • 前言
  • 工具1——整合多个天线结果
    • 用途
    • 代码实现
  • 工具2——wallman辅助工具
    • 需求
    • 代码实现

前言

工作需求,对该软件进行简单地二次开发,都是一些挺简单的代码,单纯是为了上传之后将其从本地删除

工具1——整合多个天线结果

用途

winprop最终的计算结果(必选项:接受功率,除此之外可选场强等)是以天线为单位给出热力图,如下图所示:
在这里插入图片描述

某些情况下,这种可视化的方式并不能满足我们的使用需求,比如:在一个实际项目中,我想知道我安装的两台路由器是否能够覆盖整个场景(使每个测试点位接受到的信号强度大于一定阈值),那么彼此独立的热力图并不能简洁地为你提供答案,这就是工具1的用途。
工具1中有一个关键的参数:rule,函数类型:输入是各天线在该测试点位的信号强度。在之前的场景中,我们希望的就是该点收到的信号强度中最强的那个大于阈值,所以我们的规则就是所有信号强度中取最大值。
在这里插入图片描述

代码实现

功能实现:
函数主体: plot_multi_heap_map
参数1:存放run结果的文件路径
参数2:规则(此处规则为平均值)

# ********************************************************************************************
#                                  Author: weixinzhuyi                                       #
#                                  Update: 2024-1-16                                         #
**********************************************************************************************
# a simple tool, but temporarily make up for defects that Winprop can't show us a synthetic image
# if you a better way to overcome the defect, please abandon this script immediately
import re
import os
import matplotlib.pyplot as plt
import numpy as npbase_path = 'D:/Desktop/黑龙江3D/PropName/'# structure full path
def file_name(_site_name, _antenna_name):return base_path + "Site  " + str(_site_name) + " Antenna " + str(_antenna_name) + " Power.txt"# extract information from a file with postfix "Power.txt"
def extract_pro(_file_path):test_point_pattern = re.compile(r'(\d+\.\d+)\s(\d+\.\d+)\s(-\d+\.\d+)')site_location_pattern = re.compile(r'LOCATION\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)')with open(_file_path, "r") as f:content = f.read()_test_point, test_point = re.findall(test_point_pattern, content), list()_site_location, site_location = re.findall(site_location_pattern, content), list()if _test_point:for _ in _test_point:test_point.append(list(map(float, list(_))))site_location = list(map(float, list(_site_location[0])))return site_location, test_point# a interface to plot heatmap of a certain antenna of a certain site(ap)
def plot_single_heap_map(_site_location, _test_point):x, y, power = list(zip(*_test_point))x = set(x)y = set(y)plt.imshow(np.reshape(np.array(power), (len(x), len(y))), cmap=plt.get_cmap('rainbow'))plt.tight_layout()plt.colorbar()plt.show()# get all file names which match name regex
def get_file_path(_path):# if you have a other name system, please change name regex herepattern = re.compile(r'Site\s+\d+ Antenna \d+ Power.txt')ret = list()for _ in os.listdir(_path):if re.findall(pattern, _):ret.append(_path + _)return ret# plot a new heatmap according a certain rule that you offer
# we suppose that a rule you offer a lambda function or a bulit-in function, such as max, min
def plot_multi_heap_map(_path, rule=max):# Calculationfile_dir = get_file_path(_path)site_locations, powers = list(), list()site_location, test_point = extract_pro(file_dir[0])_x, _y, power = list(zip(*test_point))site_locations.append(site_location)x = set(_x)y = set(_y)for file_path in file_dir[1:]:site_location, test_point = extract_pro(file_path)site_locations.append(site_location)_, __, power = list(zip(*test_point))powers.append(power)# Visualizationfinal = list(map(rule, list(zip(*powers))))plt.imshow(np.reshape(np.array(final), (len(x), len(y))), cmap=plt.get_cmap('rainbow'))plt.tight_layout()plt.colorbar()_site_x, _site_y, _ = list(zip(*site_locations))site_x = (np.array(_site_x) - min(x)) * len(x) / (max(x) - min(x))site_y = (np.array(_site_y) - min(y)) * len(y) / (max(y) - min(y))plt.scatter(site_y, site_x)plt.show()if __name__ == '__main__':plot_multi_heap_map(base_path, rule=lambda i: sum(i) / len(i))

工具2——wallman辅助工具

需求

众所周知,使用wallman工具建立三维仿真模型会得到一个**.idb的文件,这个文件可以用feko软件直接打开
在这里插入图片描述
除了保存为idb文件还可以保存为
.ida**二进制文本文件,我们对wallman的开发正是基于这种保存形式,
.ida文件的结构如下:(作者的注释用%%括起来,内容省略使用……)

* Indoor Database *     %数据库类型%
* Last changed on:  2. 1.2024 14: 8:50 *     %最后一次修改时间%BEGIN_MATERIAL     %开始描述3D模型的材料,开头先介绍各种参数(电磁参数、厚度等)对应的位置%
* [MATERIAL]  [ID]  [GENERAL]  ["Name of Material"]  [Thickness (in cm)]   [Filled in Display]   [Color: Red]  [Color: Green]  [Color: Blue]
* [MATERIAL]  [ID]  [FREQUENCY]  [Frequency (in MHz)]  [Dielectrictity (relative)]   [Permeability (relative)]   [Conductivity (in S/m)]  [Transmission Loss Vertical (in dB)]  [Transmission Loss Horizontal (in dB)]  [Reflection Loss (in dB)]  [Diffraction Loss incident min (in dB)]   [Diffraction Loss incident max (in dB)]  [Diffraction Loss diffracted (in dB)]MATERIAL 0 GENERAL "Default Material" 10.00000 1 150 150 150    %该材料只绑定了一个频段2000MHz%
MATERIAL 0 FREQUENCY 2000.000 4.000 1.000 0.010000 10.000 10.000 9.000 8.000 15.000 5.000 20.000 0.100 0.010 0.010 0.100……
END_MATERIAL    %结束对材料的描述%BEGIN_SHAPE    %对形状进行描述, 在保存时选择了compute the shape%
1
1 40 22.050100,89.050100, 5.000000 21.949900,89.050100, 5.000000 21.949900,56.050100, 5.000000 22.050100,89.050100, 5.000000
END_SHAPE    %结束对形状的描述%BEGIN_WALLS   %开始对各类墙体的描述,一个条目代表一面墙,一个正方体对应6个条目%
63     %墙的总数%
%墙的编号    4    x1, y1, z1  x2, y2, z2  x3, y3, z3  x4, y4, z4  材料编号   类型(正常的墙还是有内嵌还是有洞)%
64 4 26.000000,17.000000, 5.000000 26.000000, 8.000000, 5.000000 26.000000, 8.000000, 0.000000 26.000000,17.000000, 0.000000  0 0 
63 4 27.000000,25.000000, 5.000000 27.000000,18.000000, 5.000000 27.000000,18.000000, 0.000000 27.000000,25.000000, 0.000000  0 0 
62 4 27.000000,34.000000, 5.000000 27.000000,28.000000, 5.000000 27.000000,28.000000, 0.000000 27.000000,34.000000, 0.000000  0 0 
……
1 4  5.000000, 0.000000, 0.000000  5.000000, 5.000000, 0.000000  0.000000, 5.000000, 0.000000  0.000000, 0.000000, 0.000000  0 0 
END_WALLS

在了解了ida文件格式后,我们可以通过构造ida文件解决许多繁琐的问题,比如:大量的复杂复制活动
这是一个立方体:
在这里插入图片描述

这是一群立方体:
在这里插入图片描述
或者规模更大
在这里插入图片描述
看起来,我们可以在操作界面通过简单的复制黏贴获得这样的图形,没必要通过构造ida文件的方式。
确实是,对于简单图形来讲,直接复制粘贴更简单,但是一旦遇到了含有嵌入关系或者是由几个基础高度不同的图形拼接起来的整体,往往无法直接复制粘贴。

代码实现

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

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

相关文章

鲁南制药“健康幸福中国年”主题航班,开启探寻健康与幸福的旅程

“小年,小年,过了今天就是年。”提到过年,北方人的“过年”是从腊月二十三的“小年”开始的,而南方地区是在明天。虽然时间不同,但是浓浓的年味是一样的,红彤彤是主色调,喜洋洋是主乐曲&#xf…

C语言:内存分配---栈区、堆区、全局区、常量区和代码区

一、C语言内存分区 C语言内存分区示意图如下: 1. 栈区 栈区介绍 栈区由编译器自动分配释放,由操作系统自动管理,无须手动管理。栈区上的内容只在函数范围内存在,当函数运行结束,这些内容也会自动被销毁。栈区按内存…

前端秘法进阶篇之事件循环

目录 一.浏览器的进程模型 1.进程 2.线程 二.浏览器的进程和线程 1. 浏览器进程 2. 网络进程 3. 渲染进程 三.渲染主线程 四.异步 五.优先级 1. 延时队列: 2.交互队列: 3.微队列: 六.JS 的事件循环 附加:JS 中的计时器能做到精…

java 宠物在线商城系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目

一、源码特点 java 宠物在线商城系统是一套完善的java web信息管理系统 servletdaobean mvc模式,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S 模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…

open ai api 国内配置代理指南(网上最全)

1.配置须知 open ai 作为这一波AI浪潮的推动者,opne ai的gpt 系列产品在使用和体验上绝对是最强大的,现在对于开发者来说要在代码中访问open ai api是不可用的。所以本文就主要解决这个问题。我们要了解open ai 的网站gpt的访问和api的访问收费是分开来…

配置Juniper虚墙vSRX基于策略的IPsec VPN(WEB方式)

正文共:1444 字 18 图,预估阅读时间:2 分钟 关于IPsec VPN,我们已经有一个合集了(IPsec VPN)。之前接触比较多的是H3C的IPsec VPN,后来接触的厂家多了,才发现大家的模型或者叫法还是…

数据卷的常见命令,如何创建Nginx容器,修改nginx容器内的html目录下的index.html文件

数据卷 什么是数据卷 数据卷(volume)是一个虚拟目录,是容器内目录与宿主机**目录**之间映射的桥梁。 以Nginx为例,我们知道Nginx中有两个关键的目录: html:放置一些静态资源 conf:放置配置文…

文心一言4.0 VS ChatGPT4.0哪家强?!每月60块的文心一言4.0值得开吗?

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

AI短视频一键换脸小程序源码/带流量主

微信云开发AI一键视频换脸小程序源码是由极客二改后发布的,小程序增加了广告控制,插屏广告,激励广告和原生广告,由于采用了微信云开发没有后台,所以不需要域名和服务器也可以正常搭建使用,所有的配置都可以…

C++,stl,函数对象,谓词,内建函数对象

目录 1.函数对象使用 2.谓词 1.一元谓词 2.二元谓词 3.内建函数对象 1.算术仿函数 2.关系仿函数 3.逻辑仿函数 1.函数对象使用 #include<bits/stdc.h> using namespace std;class add { public:int operator()(int v1,int v2){return v1 v2;} };class print { p…

从C向C++8——多态

一.多态基础 面向对象程序设计语言有封装、继承和多态三种机制&#xff0c;这三种机制能够有效提高程序的可读性、可扩充性和可重用性。 “多态&#xff08;polymorphism&#xff09;”指的是同一名字的事物可以完成不同的功能。多态可以分为编译时的多态和运行时的多态。前者主…

Unity(单元测试)在STM32上的移植与应用

概述 Unity Test是一个为C构建的单元测试框架。本文基于STM32F407为基础&#xff0c;完全使用STM32CubeIDE进行开发&#xff0c;移植和简单使用Unity。 单片机型号&#xff1a;STM32F407VET6 软件&#xff1a;STM32CubeIDE Version: 1.14.1 Unity Version&#xff1a;2.…

儿童护眼台灯哪个值得推荐?推荐专业的儿童护眼台灯

现在的孩子很多都存在视力问题&#xff0c;而且年龄也越来越早&#xff0c;不少还为上学的孩子都早已戴上小眼镜。虽说这可能存在家族近视遗传的可能性&#xff0c;不过更多的还是后天导致的。长时间玩耍电子产品、缺乏运动、不良用眼习惯、不合适的光线等等都是导致孩子近视的…

【JavaScript 教程】

JavaScript 教程 JavaScript 在线实例为什么学习 JavaScript? JavaScript 是 Web 的编程语言。 所有现代的 HTML 页面都可以使用 JavaScript。 JavaScript 非常容易学。 JavaScript 在线实例 <!DOCTYPE html> <html> <head> <meta charset"utf-8&q…

23款奔驰S400商务版没有后排电动座椅那改装一套跟选装有区别吗

改装的后排电动座椅通常提供以下功能&#xff1a; 电动调节&#xff1a;座椅可以通过按钮或控制面板进行前后调节&#xff0c;以适应乘客的腿部空间需求。 靠背角度调节&#xff1a;乘客可以通过电动调节功能来调整座椅的靠背角度&#xff0c;以获得更舒适的坐姿。 座椅倾斜调…

一文讲透Python函数中的形式参数和实际参数

函数参数包括形式参数和实际参数&#xff0c;简称形参和实参。其中形式参数即是在定义函数时函数后面括号中的参数列表&#xff08;parameterlist&#xff09;&#xff0c;比如上一个帖子的示例中的width, length&#xff1b;实际参数则是调用函数时函数后面括号中的参数值&…

【HTML】交友软件上照片的遮罩是如何做的

笑谈 我不知道大家有没有在夜深人静的时候感受到孤苦难耐&#xff0c;&#x1f436;。于是就去下了一些交友软件来排遣寂寞。可惜的是&#xff0c;有些交友软件真不够意思&#xff0c;连一些漂亮小姐姐的图片都要进行遮罩&#xff0c;完全不考虑兄弟们的感受,&#x1f620;。所…

Go教程-什么是编程?

什么是编程&#xff0c;这是个有趣的话题。 编程是什么 编程&#xff0c;字面意思即编写程序&#xff0c;即通过既定的关键字&#xff0c;来描述你的想法&#xff0c;并让计算机的各个部件按照你的想法来做事。 这里计算机的各个部件通常来说&#xff0c;指的是CPU和IO设备。…

解决Windows更新后无法启动的十种办法,总有一种适合你

你可能已经更新了操作系统以修复错误或使用最新功能。但是,如果Windows在更新后无法启动呢? 如果你面临这样的问题,主要是由于安装文件中的错误或你的系统与最新更新不兼容。此外,损坏的MBR或驱动程序也会阻止电脑启动。 不管是什么原因,本文将用十种简单的技术来指导你…

算法沉淀——队列+宽度优先搜索(BFS)(leetcode真题剖析)

算法沉淀——队列宽度优先搜索&#xff08;BFS&#xff09; 01.N 叉树的层序遍历02.二叉树的锯齿形层序遍历03.二叉树最大宽度04.在每个树行中找最大值 队列 宽度优先搜索算法&#xff08;Queue BFS&#xff09;是一种常用于图的遍历的算法&#xff0c;特别适用于求解最短路径…