关于数组元素(ArrayPlug)的增减使用,逻辑索引和物理索引,MArrayDataBuilder

关于数组元素(ArrayPlug)的增减使用,逻辑索引和物理索引,MArrayDataBuilder

我们知道,Maya中接口(Plug)可以包含多个元素,另外每个元素也都可以再包含多个元素,形成一个多层数组接口。Maya SDK专门提供了 MArrayDataHandle 类用于处于数组接口(Array Plug)。但是我们看到,该类只能遍历读取数组元素,但是没有提供增加或者删除数组元素的方法,那如果要想对数组元素进行增减,这个该如何操作呢? 

大家可能都知道 MArrayDataBuilder 这个类可以用于处理数组元素,但是这个Attribute 必须在初始化的时候用 MFnAttribute::setUsesArrayDataBuilder(true) 来指定。默认状态是无法使用MArrayDataBuilder来处理数组的。

另外,该MArrayDataHandle 也必须从有效的data block中获得,如果是直接从接口获得的话,比如用 MPlug::getValue() 或者 MPlug::asMDataHandle()读取获得的话,也无法使用MArrayDataBuilder。

那知道了通过MArrayDataBuilder 可以增减数组元素后,那如何才能正确的增加和删除数组元素呢?这里就涉及到操作 Maya 数组时使用的逻辑索引(Logic index)和物理索引(Physic Index)了。我们知道,Maya允许开发者通过两种不同的方式来操作数组元素,逻辑索引是指元素的逻辑位置,可以是非连续的,标明了某个特定的元素。物理索引的话是指元素的物理位置,是连续的,从【0:elementCount-1】,并且代表的数据有可能会变化。

当需要添加新元素到数组中的时候,如果不清楚当前哪些逻辑索引已经被使用,那么一般推荐使用addLast() 或者addLastArray()函数,如果想要指定该元素的逻辑位置的话,那也可以使用addElement() 或者addLastArray().

同样,在删除的时候,removeElement (unsigned int index) 可用于删除指定逻辑位置的元素。但如果我们要删除数组里面的所有元素,但是元素逻辑索引又是非连续的,那怎么处理呢?

如果有MArrayDataBuilder::removeElementByPhysicIndex( unsigned int position ) 这种方法,那我们可以遍历整个数组,然后依次删除,但是遗憾的是,MArrayDataBuilder并没有提供用于删除指定物理位置元素的方法,那我们就必须找到每一个物理位置对应的逻辑位置,然后再用removeElement (unsigned int index)来删除,具体示例代码如下:

    MArrayDataBuilder outLightningBuilder =outLightningHandle.builder () ;
    uint numElements =outLightningBuilder.elementCount () ;
    for ( uint i =numElements – 1 ; i >= 0 ; –i )

    {

        outLightningHandle.jumpToArrayElement (i) ;
        uint index =outLightningHandle.elementIndex () ;
        outLightningBuilder.removeElement (index) ;
    }

    1. 使用outLightningHandle.jumpToArrayElement (i) 来指定当前元素的物理位置
    2. uint index =outLightningHandle.elementIndex () ; 用于获得该物理索引对应的逻辑索引
    3. outLightningBuilder.removeElement (index) ; 用于删除该元素

另外,要注意的一点是,我们这里删除是从数组的最后一个元素开始删起,这样是为了提高删除的性能。因为我们知道该数组是动态调整的,并可以通过MArrayDataBuilder::growArray (unsigned int amount) 和MArrayDataBuilder::setGrowSize (unsigned int size) 来调整数组增加的大小。举例如果我们从其实位置0开始删除的话,当删除了size个元素后,那么数组可能会做一个move操作,把后面的元素移到前面来减少数组长度来提高空间利用率,这样就会导致额外性能开销。

 

转载于:https://www.cnblogs.com/johnonsoftware/p/3564545.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109908.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • React 时间控件

    React 时间控件使用bootstrap的datetimepicker安装:npminstallreact-bootstrap-datetimepicker使用bootstrap的datetime安装:npminstall–savereact-datetime若使用中文,还需要安装moment,这样datetime插件中的locale属性(控制语言)才能够正常使用:安装moment:npminstal

    2022年5月23日
    84
  • hive中的数据类型:基本数据类型,集合数据类型_hive数据库类型

    hive中的数据类型:基本数据类型,集合数据类型_hive数据库类型数据类型1.Hive中的数据类型分为两类:基本类型和复杂类型2.基本类型包含:tinyint,smallint,int,bigint,float,double,boolean,string,timestamp,binary3.复杂类型:array,map和structa.array:数组类型,对应了Java中的集合或者数组。原始数据jack,johnlucy,miketom,bob,cindylily,helen,mary,alexfrank,grace,iran,edentony

    2025年12月4日
    2
  • RabbitMQ消费消息坑:failed to convert serialized Message content

    RabbitMQ消费消息坑:failed to convert serialized Message content文章目录一、问题描述二、解决方案方案一:共同使用一个对象方案二:消息JSON序列化(推荐)2.1.生产者发送消息JSON序列化2.2.消费者接收消息JSON反序列化三、测试一、问题描述2022-05-0314:01:40.630WARN16876—[ntContainer#0-2]s.a.r.l.ConditionalRejectingErrorHandler:ExecutionofRabbitmessagelistenerfailed.org.springfram

    2022年6月16日
    633
  • jdbc访问mysql(百度app下载)

     MySQL下载地址:http://dev.mysql.com/downloads/mysql/5.1.html#downloads 选择你对应的操作系统,然后选择这个系统下的第一个或者第二个,点击Pickamirror后即可下载 MySQL的JDBC驱动下载地址:http://dev.mysql.com/downloads/connector/在页面中选择你对应的开

    2022年4月10日
    35
  • protostuff java_protostuff 及其注意事项

    protostuff java_protostuff 及其注意事项google开发的开源的序列化方案protocolbuffer(简称protobuf),它的好处很多,独立于语言,独立于平台,最最重要的是它的效率相当高,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一。protostuff是一个基于protobuf实现的序列化方法,它较于protobuf最明显的好处是,在几乎不损耗性能的情况下做到了不用…

    2022年5月2日
    83
  • 利用java实现发送邮件

    利用java实现发送邮件电子邮件的应用非常广泛,常见的如在某网站注册了一个账户,自动发送一封激活邮件,通过邮件找回密码,自动批量发送活动信息等。很显然这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。本文将简单介绍如何通过Java代码来创建电子邮件,并连接邮件服务器发送邮件。电子邮件协议电子邮件在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括SMTP,POP3,IMA…

    2022年5月15日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号