AS3的自定义元数据标记

本文介绍如何在AS3中使用自定义元数据标签,并通过示例演示如何在运行时根据这些标签对类及其成员变量进行注入。

在AS3 使用元数据标签最多的应该是swf标签了,如:

 
  1. [SWF(backgroundColor = 0x000000, frameRate = 24, width = 1000, height = 600)] 

那么能不能自定义我们自己的标签,然后在运行时,获取那些含有自定义标签的类或者类成员,然后达到注入的目的呢?答案是肯定的,在robotleg等一些开源框架中也用到了注入。

要是有元数据标签需要在编译器的扩展参数中指定-keep-as3-metadatac参数:

 
  1. -keep-as3-metadata+=Inject,BindData 

后面的Inject、BindData就是下面的例子要用的两个标签

需要注意的是这个编译参数只需要在一个运行库中指定即可,比如我们使用swc,那么编译这个swc指定了-keep-as3-metadatac参数,那么在使用swc的库的项目是不需要再指定的。在-keep-as3-metadatac参数使用“+=”是为了避免把别的参数定义覆盖掉。

比如Test1.as类使用元标签:

 
  1. package 
  2.     /** 
  3.      * ... 
  4.      * @author yoyo 
  5.      */ 
  6.     [Inject]      
  7.     public class Test1 
  8.     { 
  9.         [BindData(param1="abc")] 
  10.         public var s:String = 'ssss'
  11.          
  12.         public function Test1() 
  13.         { 
  14.         } 
  15.      
  16.     } 
  17.  
  18. }; 

接下来我们做注入操作,在不需要直接引用s成员的情况下,根据BindDta标签,修改这个成员变量的值:

 
  1. package 
  2.     import flash.display.Sprite; 
  3.     import flash.events.Event; 
  4.     import flash.utils.describeType; 
  5.     import flash.xml.XMLNode; 
  6.      
  7.     /** 
  8.      * ... 
  9.      * @author yoyo 
  10.      */ 
  11.     public class Main extends Sprite 
  12.     { 
  13.          
  14.         public function Main():void 
  15.         { 
  16.             if (stage) 
  17.                 init(); 
  18.             else 
  19.                 addEventListener(Event.ADDED_TO_STAGE, init); 
  20.         } 
  21.          
  22.         private function init(e:Event = null):void 
  23.         { 
  24.             removeEventListener(Event.ADDED_TO_STAGE, init); 
  25.             // describeType方法返回的信息类似下面的xml 
  26.             /** 
  27.                <type name="Test1" base="Object" isDynamic="false" isFinal="false" isStatic="false"> 
  28.                <extendsClass type="Object"/> 
  29.                <variable name="s" type="String"> 
  30.                <metadata name="BindData"> 
  31.                <arg key="param1" value="abc"/> 
  32.                </metadata> 
  33.                <metadata name="__go_to_definition_help"> 
  34.                <arg key="pos" value="131"/> 
  35.                </metadata> 
  36.                </variable> 
  37.                <metadata name="Inject"/> 
  38.                <metadata name="__go_to_ctor_definition_help"> 
  39.                <arg key="pos" value="173"/> 
  40.                </metadata> 
  41.                <metadata name="__go_to_definition_help"> 
  42.                <arg key="pos" value="79"/> 
  43.                </metadata> 
  44.                </type> 
  45.              
  46.              */ 
  47.              
  48.             var t:Test1 = new Test1();   
  49.              
  50.             initMeta(t); 
  51.              
  52.             trace(t.s);//打印修改后的值 
  53.         } 
  54.          
  55.         /** 
  56.          * 开始对这个对象进行注入 
  57.          * @param   obj 
  58.          */ 
  59.         private function initMeta(obj:*):void 
  60.         { 
  61.             var xml:XML = describeType(obj); 
  62.              
  63.             var typeName:String = xml.@name
  64.                          
  65.             initClassMeta(obj,typeName,xml); 
  66.              
  67.             for (var i:int = 0, len:int = xml.variable.length(); i < len;i++) 
  68.             { 
  69.                 var variables:XML = xml.variable[i]; 
  70.              
  71.                 initVariableMeta(obj,typeName,variables); 
  72.             } 
  73.         } 
  74.          
  75.         /** 
  76.          * 获取含有自定义标签的类对象 
  77.          * @param   xml 
  78.          */ 
  79.         private function initClassMeta(obj:*,typeName:String,xml:XML):void 
  80.         { 
  81.             for (var i:int = 0, len:int = xml.metadata.length(); i < len;i++) 
  82.             { 
  83.                 var mata:XML = xml.metadata[i]; 
  84.                 var metaName:String = mata.@name
  85.                 switch (metaName) 
  86.                 { 
  87.                     case 'Inject'
  88.                         trace(typeName + ',Inject:' + metaName); 
  89.                         break
  90.                 } 
  91.             } 
  92.         } 
  93.          
  94.         /** 
  95.          * 获取含有自定义标签的成员变量 
  96.          * @param   xml 
  97.          */ 
  98.         private function initVariableMeta(obj:*,typeName:String,xml:XML):void 
  99.         { 
  100.             var name:String = xml.@name
  101.             var type:String = xml.@type
  102.             for (var i:int = 0, len:int = xml.metadata.length(); i < len;i++) 
  103.             { 
  104.                 var mata:XML = xml.metadata[i]; 
  105.                 var metaName:String = mata.@name
  106.                 switch (metaName) 
  107.                 { 
  108.                     case 'BindData'
  109.                         trace(typeName + ',BindData:' + metaName + '(' + mata.arg[0].@value + ')'); 
  110.                         obj[name] = 'inject';//修改这个成员变量的值 
  111.                         break
  112.                 } 
  113.             } 
  114.         } 
  115.      
  116.     } 

输出如下:


完整代码下载:metaDataTest.zip

作者:YoYo,原文地址:http://yoyo.play175.com/p/186.html


### 创建和使用 Open3D 自定义数据集 为了在 Open3D 中创建和使用自定义数据集,主要步骤涉及准备数据文件、编写读取这些文件的 Python 脚本以及配置用于训练或测试的参数。 #### 数据预处理 对于三维点云数据集而言,通常会涉及到将原始扫描数据转换成标准格式。S3DIS 是一种常见的室内场景分割数据集,在该数据集中,每个房间被划分为多个区域,并标注有不同的类别标签[^1]。因此,如果打算基于 S3DIS 风格来构建自己的数据集,则应遵循类似的结构化方式存储点坐标及其对应的语义信息。 ```python import numpy as np from open3d.ml.datasets import BaseDataset class CustomPointCloudDataset(BaseDataset): def __init__(self, data_dir, split=&#39;train&#39;): super().__init__() # 加载点云路径列表和其他必要的元数据 self.data_files = [...] # 替换为实际加载逻辑 # 定义拆分模式下的索引范围 if split == &#39;train&#39;: self.indices = range(0, int(len(self.data_files)*0.8)) elif split == &#39;val&#39;: self.indices = range(int(len(self.data_files)*0.8), len(self.data_files)) def get_attr(self, idx): path = self.data_files[self.indices[idx]] name = path.stem return {&#39;name&#39;: str(name), &#39;path&#39;: str(path)} def get_data(self, idx): attr = self.get_attr(idx) points = ... # 使用numpy或其他库从文件中读取点云数据 labels = ... # 如果有标签的话也一同读取 return dict(points=points, feat=None, label=labels) ``` 此代码片段展示了如何继承 `BaseDataset` 类来自定义一个新的点云数据集类。通过重写 `get_attr()` 和 `get_data()` 方法可以指定获取特定样本属性的方式以及具体怎样解析二进制文件中的几何特征与分类标记[^2]。 #### 训练模型前的数据准备 当准备好上述基础框架之后,还需要确保所使用的深度学习算法能够接受这种输入形式。例如,在 MMDetection3D 的案例里提到过需要按照 COCO JSON 文件的形式组织实例级目标检测任务所需的边界框描述;而对于更广泛的计算机视觉应用场景来说,则可能只需要简单的 NumPy 数组即可满足需求[^3]。 最后一步就是调整超参设置并启动训练过程了!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值