Flex通用克隆(clone)方法

本文介绍了一种利用Flex反射功能实现的对象克隆方法,该方法能够递归地复制对象及其属性,适用于各种自定义类及集合类型,如Array和ArrayCollection。

为每个Vo一一书写clone()方法是一件麻烦事,利用flex的反射功能可实现较通用的克隆方法,本方法可保留类型信息,比flex自带的ObjecProxy的copy()和clone()好用哦,代码如下:

    import flash.utils.ByteArray;
    import flash.utils.describeType;
    import flash.utils.getDefinitionByName;
    import flash.utils.getQualifiedClassName;
   
    import mx.collections.ArrayCollection;
    import mx.collections.IList;
    import mx.formatters.DateFormatter;
    import mx.utils.ObjectUtil;
   
    public class CommonUtil extends Object

    {

        public static function clone(obj:Object):Object
        {
            var instance:Object = null;
                    
            try {
                var xmlType:XML = describeType(obj);
                var typeName:String = xmlType.@name;
                if(isBasicTypeName(typeName)) return obj;           
                if(typeName == "Array")
                {
                    var arr:Array = new Array();
                    for(var i:String in obj)
                    {
                        arr[i] = clone(obj[i]);
                    }
                    return arr;
                }
                else if(typeName.search("ArrayCollection") >= 0)
                {
                    var coll:ArrayCollection = new ArrayCollection();
                    for each(var item:Object in obj)
                    {
                        coll.addItem(clone(item));
                    }
                    return coll;
                }
               
                var className:String = getQualifiedClassName(obj);
                var clazz:Class = Class(getDefinitionByName(className));
                instance = new clazz();
               
                var objInfo:Object = ObjectUtil.getClassInfo(obj);
                var fieldName:Array = objInfo["properties"] as Array;
                for each(var q:QName in fieldName){
                    //trace(q.localName);
                    if(xmlType.@isDynamic == "true")
                    {
                        instance[q.localName] = clone(obj[q.localName]);
                    }
                    else
                    {
                        var accs:XMLList = xmlType..accessor.(@name == q.localName);
                        if(accs != null && accs.length() > 0 && (accs[0].@access == "readwrite" || accs[0].@access == "write"))
                        {
                            instance[q.localName] = clone(obj[q.localName]);
                        }
                    }
                }
            }
            catch(e:ReferenceError)
            {
                trace(e);
            }
            catch(e:TypeError)
            {
                trace(e);
            }  
           
            return instance;
        }

 

        public static function isBasicTypeName(typeName:String):Boolean
        {
            return (typeName == "String"
                || typeName == "int"
                || typeName == "uint"
                || typeName == "Boolean"
                || typeName == "Number"
                || typeName == "null");
        }

    }

使用方法:

public class A    
{  
    private var _a:int = 1;
    private var _arr:Array = ['a', 'b', 'c'];   
    public function get a():int
    {
        return _a;
    }
    public function set a(value:int):void
    {
        _a = value;
    }
    public function get arr():Array
    {
        return _arr;
    }
    public function set arr(value:Array):void
    {
        _arr = value;
    }
}

var a:A = new A();

var b:A = CommonUtil.clone(a);       // b是a的一个副本

 

 

      

CMakeLists文件如下“cmake_minimum_required(VERSION 3.8) project(flex_core) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(std_msgs REQUIRED) find_package(geometry_msgs REQUIRED) find_package(rosidl_default_generators REQUIRED) find_package(yaml-cpp REQUIRED) find_package(Threads REQUIRED) find_package(Qt5 COMPONENTS Widgets Core SerialPort REQUIRED) find_library(WIRINGPI_LIBRARIES NAMES wiringPi) if(NOT WIRINGPI_LIBRARIES) message(FATAL_ERROR "wiringPi library not found") endif() rosidl_generate_interfaces(${PROJECT_NAME} "msg/RemoteControl.msg" DEPENDENCIES std_msgs ) include_directories( include ) include_directories(${YAML_CPP_INCLUDE_DIR}) if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) set(ament_cmake_copyright_FOUND TRUE) set(ament_cmake_cpplint_FOUND TRUE) ament_lint_auto_find_test_dependencies() endif() ament_package() qt5_wrap_cpp(remote_data_node_header_SRC include/flex_core/RemoteControlParser.hpp) add_executable(flex_control_core_node node/FlexCoreNode.cpp # src/FlexCore.cpp src/DriverControl.cpp ${remote_data_node_header_SRC} ) target_link_libraries(flex_control_core_node ${CATKIN_LIBRARIES} ${WIRINGPI_LIBRARY} ${YAML_CPP_LIBRARIES} Threads::Threads Qt5::Widgets Qt5::Core Qt5::SerialPort wiringPi ) ament_target_dependencies(flex_control_core_node rclcpp std_msgs yaml-cpp) install(TARGETS flex_control_core_node DESTINATION lib/${PROJECT_NAME} )” 报错为In file included from /home/shu-pi/flex_shu_ws/build/flex_core/include/flex_core/moc_RemoteControlParser.cpp:10: /home/shu-pi/flex_shu_ws/build/flex_core/include/flex_core/../../../../src/flex_core/include/flex_core/RemoteControlParser.hpp:15:10: fatal error: flex_core/msg/remote_control.hpp: 没有那个文件或目录 15 | #include "flex_core/msg/remote_control.hpp" | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
最新发布
09-15
<think>好的,用户的问题是关于在ESP32平台上使用MicroPython集成LVGL图形库的编译方法。首先,我需要回忆一下相关的知识,确保信息准确。ESP32和MicroPython的结合比较常见,而LVGL是一个轻量级的图形库,适用于嵌入式系统。用户需要的是编译方法,所以可能需要涉及固件编译、库的集成步骤等。 首先,用户可能需要先搭建编译环境,比如安装必要的工具链和依赖库。然后,可能需要获取MicroPython的源代码,并添加LVGL的库文件。接着,配置ESP32的固件,启用LVGL相关的模块,最后进行编译和烧录。这些步骤是否都需要详细说明呢?用户可能对每一步的具体操作不太清楚,所以需要分步骤解释。 另外,考虑到用户可能使用不同的操作系统,比如Windows或Linux,是否需要分别说明?或者是否有通用方法?可能应该推荐使用Linux环境,因为很多嵌入式开发工具在Linux上更友好。但也要提到Windows用户可能需要安装额外的工具,比如MSYS2或者WSL。 还需要注意MicroPython的版本是否支持LVGL,可能需要特定的分支或补丁。例如,官方MicroPython可能没有直接集成LVGL,所以可能需要使用第三方仓库或者社区维护的版本。比如,提到lv_micropython这个仓库,这是否正确?需要确认是否存在这样的项目。 另外,编译过程中可能涉及到配置菜单(menuconfig)来启用特定的驱动,比如显示驱动、触摸屏驱动等。用户可能需要根据硬件配置进行相应的设置,比如SPI或I2C接口的配置。这部分是否需要详细说明,或者给出示例配置? 还要考虑用户可能的错误,比如缺少依赖库,编译错误如何处理。可能需要建议查看错误日志,安装必要的依赖,或者参考社区资源。例如,参考LVGL的官方文档或MicroPython的论坛。 最后,生成相关问题的时候,需要考虑用户后续可能遇到的问题,比如如何优化显示性能、如何添加UI组件、如何处理触摸输入等。这些问题可以帮助用户进一步开发。 现在需要验证信息是否正确。比如,lv_micropython仓库是否存在?是的,LVGL官方确实有一个lv_micropython的仓库,专门用于集成LVGL到MicroPython中。编译步骤是否正确?通常需要克隆仓库,设置ESP32的目标,然后编译。可能需要使用make命令,指定正确的板型,比如ESP32-WROVER-KIT。 另外,烧录步骤是否需要使用esptool.py,或者通过idf.py flash?根据仓库的文档,可能使用idf.py的命令,因为它是基于ESP-IDF的。不过,用户可能更熟悉esptool,所以需要明确说明正确的命令。 还有,配置部分是否需要修改sdkconfig文件,或者通过menuconfig?可能建议用户运行make menuconfig来配置LVGL的参数,比如颜色深度、显示分辨率等。这部分需要详细说明,因为用户可能不熟悉这些配置选项。 总之,回答需要分步骤,从环境搭建到编译烧录,再到验证,确保用户能一步步操作。同时,引用相关的资源,如GitHub仓库和文档,帮助用户进一步查阅。生成的问题要围绕后续可能的步骤,比如优化、驱动适配、UI设计等,这样用户如果有进一步需求,可以参考这些问题。</think>在ESP32平台上使用MicroPython集成LVGL图形库的编译方法可分为以下步骤: ### 1. 环境准备 - **安装ESP-IDF框架**:需使用ESP-IDF v4.4或更高版本,用于ESP32固件编译[^2]。 - **安装MicroPython依赖**: ```bash sudo apt-get install git wget make libncurses-dev flex bison gperf python3 python3-pip ``` - **克隆MicroPython仓库**: ```bash git clone --recursive https://github.com/micropython/micropython.git ``` ### 2. 集成LVGL库 - **获取LVGL绑定库**:使用社区维护的`lv_micropython`分支: ```bash git clone https://github.com/lvgl/lv_micropython.git cd lv_micropython git submodule update --init --recursive ``` - **配置目标平台**: ```bash make -C mpy-cross cd ports/esp32 make BOARD=GENERIC_SPIRAM ``` ### 3. 硬件驱动适配 - **修改`mpconfigboard.h`**:在`ports/esp32/boards/GENERIC_SPIRAM`目录中添加显示驱动配置,例如: ```c #define MICROPY_HW_LCD_MOSI 23 #define MICROPY_HW_LCD_MISO 19 #define MICROPY_HW_LCD_SCK 18 ``` - **启用LVGL组件**:通过`menuconfig`启用SPI/I2C显示接口: ```bash make menuconfig # 选择Component config → LVGL → Enable LVGL ``` ### 4. 编译与烧录 - **编译固件**: ```bash make clean && make ``` - **烧录至ESP32**: ```bash esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash -z 0x1000 build-GENERIC_SPIRAM/firmware.bin ``` ### 5. 验证 在MicroPython REPL中测试LVGL初始化: ```python import lvgl as lv lv.init() print("LVGL version:", lv.version_major(), ".", lv.version_minor()) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lazyclough

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值