0

我刚刚开始使用 itcl,我发现如何将 itcl 对象从一个类传递到另一个类?但这对我没有帮助。

我定义了以下对象:

package require Itcl

namespace eval FEM {

   itcl::class Node {
       variable nid
       variable x
       variable y
       variable z

       constructor {{NID 0} {coordX 0} {coordY 0} {coordZ 0}} {
         set nid $NID
         set x $coordX
         set y $coordY
         set z $coordZ
         return $this}

       method is {nid coordX coordY coordZ}
       method printString  
      }

   itcl::body Node::is {NID coordX coordY coordZ} {
       set nid $NID  
       set x $coordX
       set y $coordY
       set z $coordZ}       

   itcl::body Node::printString {} {
       return "$nid $x $y $z"}

# #######################################################

   itcl::class CQUAD {
       variable eid
       variable pid
       variable node1
       variable node2
       variable node3
       variable node4

       constructor {{EID 0} {PID 0} {NODE1 0} {NODE2 0} {NODE3 0} {NODE4 0}} {
         set eid $EID
         set pid $PID
         set node1 $NODE1
         set node2 $NODE2
         set node3 $NODE3
         set node4 $NODE4
         return $this}

       method is {EID PID NODE1 NODE2 NODE3 NODE4}
       method printString  

      }  

   itcl::body CQUAD::is { EID PID NODE1 NODE2 NODE3 NODE4 } {
       set eid $EID
       set pid $PID  
       set node1 $NODE1
       set node2 $NODE2
       set node3 $NODE3
       set node4 $NODE4}       

   itcl::body CQUAD::printString {} {
       return "$eid $pid $node1 $node2 $node3 $node4"}
  }

}

# ########################################################
# Test  

for {set n 1} {$n <= 4} {incr n} {  
   set coord1 [expr {$n+1} ]
   set coord2 [expr {$n+2} ]
   set coord3 [expr {$n+3} ]   
   set NID N$n
   ::FEM::Node $NID $n $coord1 $coord2 $coord3
   puts "[$NID printString]"
 }

set PID 99
set EID 88 

以下是错误的,因为$N1只是N1 不是“节点”N1

::FEM::CQUAD MyQuad $EID $PID $N1 $N2 $N3 $N4

但是如何将 Node 类型的对象传递给 CQUAD 类型的对象?我也试过:

::FEM::CQUAD MyQuad $EID $PID $::FEM:Node::N1 $::FEM:Node::N2 $::FEM:Node::N3 $::FEM:Node::N4

另外,如何删除对象?unset $N1是错unset $::FEM::Node::N1的也是假的

最后一个问题:假设我有一个 CQUAD 对象,其中包含 Node 类型的对象:我怎样才能获得 CQUAD 1 的 Node2 的 y 坐标?

4

1 回答 1

2

在 Itcl 中(与 Tcl 的其余部分一样),您不传递对象本身,而是传递对象的名称,消费命令将其解析为对该对象的引用

一般来说,一个对象的名称应该作为它的完全限定名称传递,以便在 Tcl 中的任何地方都可以将这些名称理解为相同的含义。您可以N1使用namespace which N1. (例外情况是 Tk 小部件名称,它必须在全局命名空间中,不合格地传递,并且始终以 . 开头.。)

要删除对象(而不是包含对象名称的变量),请使用:

itcl::delete object $theObjectName

请注意,Itcl 对象不会被垃圾收集(但可以在简单的情况下使用适当堆栈帧中变量上的删除跟踪来模拟这种情况;该itcl::local命令使这更容易)。

要访问Itcl 对象的公共变量,请使用cget方法(如果您使用过 Tk,这应该非常熟悉)。

set theYcoord [[$CQUAD cget -Node2] cget -y]

要使变量公开,您的类定义应该说,例如:

public variable y
public {
    # Both x and y are to be public variables
    variable x
    variable y
}

我建议将公共变量的数量保持在最低限度,但这是你的事。

于 2014-01-27T09:55:32.057 回答