winprop二次开发

news2025/2/25 5:46:02

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 np

base_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 here
    pattern = 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):
    # Calculation
    file_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)

    # Visualization
    final = 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

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

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

相关文章

MIT-Missing Semester_Topic 3:Editors (Vim) 练习题

文章目录 练习一练习二练习三练习四练习五练习六练习七练习八 本 Topic 的 MIT 讲解网页(练习题未给解答) 练习一 自行完成 vimtutor。vimtutor 是 Vim 本身附带的一个入门教程,在 shell 中直接输入 vimtutor 便能运行。注意该教程在 8024 大…

第2讲投票系统后端架构搭建

创建项目时&#xff0c;随机选择一个&#xff0c;后面会生成配置properties文件 生成文件 maven-3.3.3 设置阿里云镜像 <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more cont…

助力智能化农田作物除草,基于轻量级YOLOv8n开发构建农田作物场景下玉米苗、杂草检测识别分析系统

在我们前面的系列博文中&#xff0c;关于田间作物场景下的作物、杂草检测已经有过相关的开发实践了&#xff0c;结合智能化的设备可以实现只能除草等操作&#xff0c;玉米作物场景下的杂草检测我们则少有涉及&#xff0c;这里本文的主要目的就是想要基于最新的YOLOv8下最轻量级…

【开源】JAVA+Vue.js实现高校学院网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学院院系模块2.2 竞赛报名模块2.3 教育教学模块2.4 招生就业模块2.5 实时信息模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学院院系表3.2.2 竞赛报名表3.2.3 教育教学表3.2.4 招生就业表3.2.5 实时信息表 四、系…

Kafka 入门介绍

目录 一. 前言 二. 使用场景 三. 分布式的流平台 四. Kafka 的基本术语 4.1. 主题和日志 &#xff08;Topic 和 Log&#xff09; 4.2. 分布式&#xff08;Distribution&#xff09; 4.3. 异地数据同步技术&#xff08;Geo-Replication&#xff09; 4.4. 生产者&#xf…

2.2-学成在线内容管理之课程分类查询+新增课程

文章目录 内容管理模块4 课程分类查询4.1 需求分析4.2 接口定义4.3 接口开发4.3.1 树型表查询4.3.2 开发Mapper 4.4 接口测试4.4.1 接口层代码完善4.4.2 测试接口 5 新增课程5.1 需求分析5.1.1 业务流程4.1.2 数据模型 5.2 接口定义5.3 接口开发5.3.1 保存课程基本信息5.3.2 保…

ZigBee学习——BDB

✨本博客参考了善学坊的教程&#xff0c;并总结了在实现过程中遇到的问题。 善学坊官网 文章目录 一、BDB简介二、BDB Commissioning Modes2.1 Network Steering2.2 Network Formation2.3 Finding and Binding&#xff08;F & B&#xff09;2.4 Touchlink 三、BDB Commissi…

【linux系统体验】-ubuntu简易折腾

ubuntu 一、终端美化二、桌面美化2.1 插件安装2.2 主题和图标2.3 美化配置 三、常用命令 以后看不看不重要&#xff0c;咱就是想记点儿东西。一、终端美化 安装oh my posh&#xff0c;参考链接&#xff1a;Linux 终端美化 1、安装字体 oh my posh美化工具可以使用合适的字体&a…

深入浅出CChart 每日一课——红花当然配绿叶,CChart辅助图形绘制

各位同学&#xff0c;好久不见&#xff0c;我可想死你们了&#xff01;&#xff01;&#xff01;咦&#xff0c;那位不是巩叔吗&#xff1f;不好意思&#xff0c;侵权了&#xff0c;请多担待_。 前面的课程呢&#xff0c;拓展的内容比较多&#xff0c;最近笨笨想聚焦在CChart本…

微服务多级缓存

多级缓存 1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; •请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈 •Redis缓存…

Structured Streaming

目录 一、概述 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;两种处理模型 &#xff08;三&#xff09;Structured Streaming和Spark SQL、Spark Streaming关系 二、编写Structured Streaming程序的基本步骤 &#xff08;一&#xff09;实现步骤 &…

jsp计算机线上教学系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 计算机线上教学系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5…

WebSocketServer方法里注入不了其他类

请直接看原文: WebSocketServer无法注入其他对象的问题 - 知乎 (zhihu.com) WebSocket服务无法使用自动注入解决方法_websocket sever不可以直接注入吧-CSDN博客 ------------------------------------------------------------------------------------------------------…

2.11日学习打卡----初学RocketMQ(二)

2.11日学习打卡 一. RocketMQ整合springboot 首先配置pom.xml文件 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>annotationProcessor</scope></dependency><dependency>…

Java图形化界面编程——处理位图 笔记

2.8.3 处理位图 ​ 如果仅仅绘制一些简单的几何图形&#xff0c;程序的图形效果依然比较单调 。 AWT 也允许在组件上绘制位图&#xff0c; Graphics 提供了 drawlmage() 方法用于绘制位图&#xff0c;该方法需要一个Image参数一一代表位图&#xff0c;通过该方法就可 以绘制出…

苹果Mac键盘如何将 F1 到 F12 取消按Fn

苹果电脑安装了Win10操作系统之后&#xff0c;F1到F12用不了怎么办的解决方法。本文将介绍一些解决方法&#xff0c;帮助您解决无法使用F1到F12功能键的问题。 使用 Mac系统的人都知道&#xff0c;Mac系统默认是没有开启 F1-F12 的使用的&#xff0c;平时我们使用的系统都可以使…

【C语言】实现双向链表

目录 &#xff08;一&#xff09;头文件 &#xff08;二&#xff09; 功能实现 &#xff08;1&#xff09;初始化 &#xff08;2&#xff09;打印链表 &#xff08;3&#xff09; 头插与头删 &#xff08;4&#xff09;尾插与尾删 &#xff08;5&#xff09;指定位置之后…

降噪和音频修复 iZotope RX 7 Advanced

iZotope RX 7 Advanced 是一款功能强大的音频修复和增强软件&#xff0c;它能够帮助用户轻松应对各种音频问题&#xff0c;提供全面的工具和技术来优化和改善音频质量。 首先&#xff0c;iZotope RX 7 Advanced 具有出色的降噪功能。无论是背景噪音、杂音还是其他干扰因素&…

【Java EE初阶十二】网络编程TCP/IP协议(二)

1. 关于TCP 1.1 TCP 的socket api tcp的socket api和U大片的socket api差异很大&#xff0c;但是和前面所讲的文件操作很密切的联系 下面主要讲解两个关键的类&#xff1a; 1、ServerSocket&#xff1a;给服务器使用的类&#xff0c;使用这个类来绑定端口号 2、Socket&#xf…