【问题标题】:How do I assign a property to a reference assignment for a function (without using execute)如何将属性分配给函数的引用分配(不使用执行)
【发布时间】:2019-12-14 06:21:13
【问题描述】:

我希望将属性分配给 MAXScript 的函数。

这是我尝试过的:

fn getProp type: = (
  $.'type'
  )
getProp type:'pos'

我想将pos 属性作为变量传递给函数getProp 并像以下代码一样检索它:

$.pos.


另一个获取所选对象比例的示例,代码如下所示:

fn getProp type: = (
  $.'type'
  )
getProp type:'rotation'

这里以我不想做的执行版本为例:

fn getProp type: = (
  execute("$."+type)
  )
getProp type:#pos
-- will return: [25.051,-115.88,0]

编辑

我想在它的上下文中实现什么的完整代码,什么有效,什么无效。见第 55 行。

try(destroydialog ::lvRolTest)catch()
rollout lvRolTest "Check Mate.."
(

  local  _lvSetItemsInvertProp, _lvSetItemsInvertPropNotWorking

  label         countLabelPrefix       "How many you say ?" across:3
  label         countLabelVal          ""
  checkButton   chkLvToggleAllButton   "Toggle All..."
  dotNetControl lv                     "ListView" width:270 height:535 pos:[10,30]

  on lvRolTest open do (
    lv.View                  = (dotNetClass "View").Details
    lv.FullRowSelect         = true
    lv.MultiSelect           = true
    lv.Checkboxes            = true
    lv.Columns.add           ("Items")

    lv.columns.item[0].width = lvRolTest.width-55

    for x=1 to 100 do (
      lv.BeginUpdate()
      local newLvItem = dotNetObject "ListViewItem" ("Item " + x as string)
      newLvItem.checked = true
      lv.EndUpdate()
      lv.items.add newLvItem
      )
    lv.Focus()
    countLabelVal.text = (lv.CheckedItems.count) as string
    )

  on chkLvToggleAllButton changed state do (
    if state do chkLvToggleAllButton.text         = "Toggle All Again..."

    -- This is working
    --     _lvSetItemsInvertProp ("lvRolTest" as string) ("lv" as string) prop:#Checked

    -- This is not
    _lvSetItemsInvertPropNotWorking lv prop:#Checked

    if not state do chkLvToggleAllButton.text     = "Toggle All..."
    countLabelVal.text = (lv.CheckedItems.count) as string
    lv.Focus()
    )

  -- This is working
  fn _lvSetItemsInvertProp rolArg lvArg prop:#Checked = (
    execute("for i = 0 to "+rolArg+"."+lvArg+".items.count-1 do (
      local item = "+rolArg+"."+lvArg+".items.item[i]
      if item."+prop+" == true then item."+prop+" = false else item."+prop+" = true
      )")
    )

  --   This is not
  fn _lvSetItemsInvertPropNotWorking ListView prop:#Checked = (
    for i = 0 to lvRolTest.lv.items.count-1 do (
      local item = getProperty (lvRolTest.lv.items.item[i]) prop
      if item == true then item = false else item = true
      )
    )

  )

createDialog lvRolTest 300 575 pos:[1850,700] style:#(#style_SysMenu, #style_ToolWindow, #style_resizing)

编辑 2。根据下面的 Swordslayers 评论,使用解决方案更新代码。

try(destroydialog ::lvRolTest)catch()
rollout lvRolTest "Check Mate.."
(

  local  _lvSetItemsInvertProp

  label         countLabelPrefix       "How many you say ?" across:3
  label         countLabelVal          ""
  checkButton   chkLvToggleAllButton   "Toggle All..."
  dotNetControl lv                     "ListView" width:270 height:535 pos:[10,30]

  on lvRolTest open do (
    lv.View                  = (dotNetClass "View").Details
    lv.FullRowSelect         = true
    lv.MultiSelect           = true
    lv.Checkboxes            = true
    lv.Columns.add           ("Items")

    lv.columns.item[0].width = lvRolTest.width-55

    for x=1 to 100 do (
      lv.BeginUpdate()
      local newLvItem = dotNetObject "ListViewItem" ("Item " + x as string)
      newLvItem.checked = true
      lv.EndUpdate()
      lv.items.add newLvItem
      )
    lv.Focus()
    countLabelVal.text = (lv.CheckedItems.count) as string
    )

  on chkLvToggleAllButton changed state do (
    if state do chkLvToggleAllButton.text         = "Toggle All Again..."
    if not state do chkLvToggleAllButton.text     = "Toggle All..."
    _lvSetItemsInvertProp lv prop:#Checked
    _lvSetItemsInvertProp lv prop:#Selected
    countLabelVal.text = (lv.CheckedItems.count) as string
    lv.Focus()
    )

  fn _lvSetItemsInvertProp lvArg prop:#Checked = (
    for i = 0 to lv.items.count-1 do (
      local bool = getProperty (lvArg.items.item[i]) prop
      setProperty (lvArg.items.item[i]) prop (not bool)
      )
    )

  )

createDialog lvRolTest 300 575 pos:[1850,700] style:#(#style_SysMenu, #style_ToolWindow, #style_resizing)

【问题讨论】:

    标签: maxscript


    【解决方案1】:

    您一次提到了几件事,映射函数(我在示例代码中看不到任何痕迹,因此将忽略)并使用您自己的函数获取给定变量属性名称的属性 - 当然您尝试过使用 @987654321 @:

    getProperty $ type
    

    【讨论】:

    • 谢谢。抱歉,术语不正确。我已经修改了 OP 以准确显示问题所在。
    • 那是因为你设置的是变量的内容,而不是属性,使用 setProperty 就完成了:local bool = getProperty (lvRolTest.lv.items.item[i]) prop setProperty (lvRolTest.lv.items.item[i]) prop (not bool)
    • 非常感谢。我会用更新后的解决方案更新 Q。
    猜你喜欢
    • 2011-05-21
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 2014-01-16
    相关资源
    最近更新 更多