# # Copyright 2003 (c) Pointwise, Inc. # All rights reserved. # # This sample Gridgen script is not supported by Pointwise, Inc. # It is provided freely for demonstration purposes only. # SEE THE WARRANTY DISCLAIMER AT THE BOTTOM OF THIS FILE. # gg::tkLoad catch { set scriptDir [file dirname [info script]] source [file join $scriptDir pwiLogo.glf] } set xyz1 "0 0 0" set xyz2 "0 0 0" set dimi 10 set dimj 10 set dimk 10 proc checkInputStatus { } { global BrickBlock if {0 == $BrickBlock(xyz1) || 0 == $BrickBlock(xyz2) || \ 0 == $BrickBlock(iDim) || 0 == $BrickBlock(jDim) || \ 0 == $BrickBlock(kDim)} { $BrickBlock(okButton) configure -state disabled } else { $BrickBlock(okButton) configure -state normal } } proc getConnectorByEndPoints { pt1 pt2 } { foreach con [gg::conGetAll] { set pta [gg::conGetPt $con -arc 0] set ptb [gg::conGetPt $con -arc 1] if { ($pt1 == $pta && $pt2 == $ptb) || ($pt2 == $pta && $pt1 == $ptb) } { return $con } } puts "error: No connector found ($pt1, $pt2)" abort } proc getDomainByCorners { pt1 pt2 pt3 pt4 } { foreach dom [gg::domGetAll] { set pt {} gg::domReport $dom dInfo STRUCTURE lappend pt [gg::domGetPt $dom "1 1"] lappend pt [gg::domGetPt $dom "[lindex $dInfo(dimensions) 0] 1"] lappend pt [gg::domGetPt $dom "1 [lindex $dInfo(dimensions) 1]"] lappend pt [gg::domGetPt $dom $dInfo(dimensions)] if { [lsearch $pt $pt1]!=-1 && [lsearch $pt $pt2]!=-1 && [lsearch $pt $pt3]!=-1 && [lsearch $pt $pt4]!=-1 } { return $dom } } puts "error: No domain found ($pt1, $pt2, $pt3, $pt4)" gg::abort } ############################################################################ # makeRectangularPrism: Generates a block ############################################################################ proc makeRectangularPrism { x1 y1 z1 x2 y2 z2 {dx 10} {dy 10} {dz 10} } { if { $x1 == $x2 || $y1 == $y2 || $z1 == $z2 } { tk_messageBox -icon error -title "Error..." -message "Cannot create block with any opposite corner x,y,z values equal (zero volume).\nPlease modify either the min coordinate or the max coordinate." -type ok return 0; } if { [catch { gg::conBegin gg::segBegin -type 3D_LINE gg::segAddControlPt "$x1 $y1 $z1" gg::segAddControlPt "$x1 $y1 $z2" gg::segEnd set con(0,0,2) [gg::conEnd] gg::conBegin gg::segBegin -type 3D_LINE gg::segAddControlPt "$x2 $y2 $z1" gg::segAddControlPt "$x2 $y2 $z2" gg::segEnd set con(1,1,2) [gg::conEnd] gg::conBegin gg::segBegin -type 3D_LINE gg::segAddControlPt "$x1 $y2 $z1" gg::segAddControlPt "$x1 $y2 $z2" gg::segEnd set con(0,1,2) [gg::conEnd] gg::conBegin gg::segBegin -type 3D_LINE gg::segAddControlPt "$x2 $y1 $z1" gg::segAddControlPt "$x2 $y1 $z2" gg::segEnd set con(1,0,2) [gg::conEnd] gg::conDim "$con(0,0,2) $con(0,1,2) $con(1,0,2) $con(1,1,2)" $dz gg::conBegin gg::segBegin -type 3D_LINE gg::segAddControlPt "$x1 $y1 $z1" gg::segAddControlPt "$x1 $y2 $z1" gg::segEnd set con(0,2,0) [gg::conEnd] gg::conBegin gg::segBegin -type 3D_LINE gg::segAddControlPt "$x2 $y1 $z2" gg::segAddControlPt "$x2 $y2 $z2" gg::segEnd set con(1,2,1) [gg::conEnd] gg::conBegin gg::segBegin -type 3D_LINE gg::segAddControlPt "$x1 $y1 $z2" gg::segAddControlPt "$x1 $y2 $z2" gg::segEnd set con(0,2,1) [gg::conEnd] gg::conBegin gg::segBegin -type 3D_LINE gg::segAddControlPt "$x2 $y1 $z1" gg::segAddControlPt "$x2 $y2 $z1" gg::segEnd set con(1,2,0) [gg::conEnd] gg::conDim "$con(0,2,0) $con(1,2,0) $con(0,2,1) $con(1,2,1)" $dy gg::conBegin gg::segBegin -type 3D_LINE gg::segAddControlPt "$x1 $y1 $z1" gg::segAddControlPt "$x2 $y1 $z1" gg::segEnd set con(2,0,0) [gg::conEnd] gg::conBegin gg::segBegin -type 3D_LINE gg::segAddControlPt "$x1 $y2 $z2" gg::segAddControlPt "$x2 $y2 $z2" gg::segEnd set con(2,1,1) [gg::conEnd] gg::conBegin gg::segBegin -type 3D_LINE gg::segAddControlPt "$x1 $y1 $z2" gg::segAddControlPt "$x2 $y1 $z2" gg::segEnd set con(2,0,1) [gg::conEnd] gg::conBegin gg::segBegin -type 3D_LINE gg::segAddControlPt "$x1 $y2 $z1" gg::segAddControlPt "$x2 $y2 $z1" gg::segEnd set con(2,1,0) [gg::conEnd] gg::conDim "$con(2,0,0) $con(2,1,0) $con(2,0,1) $con(2,1,1)" $dx gg::domBegin -type STRUCTURED gg::edgeBegin gg::edgeAddCon $con(2,0,0) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(0,0,2) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(2,0,1) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(1,0,2) gg::edgeEnd set dom(0) [gg::domEnd] gg::domBegin -type STRUCTURED gg::edgeBegin gg::edgeAddCon $con(2,1,0) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(0,1,2) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(2,1,1) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(1,1,2) gg::edgeEnd set dom(1) [gg::domEnd] gg::domBegin -type STRUCTURED gg::edgeBegin gg::edgeAddCon $con(0,2,0) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(2,0,0) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(1,2,0) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(2,1,0) gg::edgeEnd set dom(2) [gg::domEnd] gg::domBegin -type STRUCTURED gg::edgeBegin gg::edgeAddCon $con(0,2,1) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(2,0,1) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(1,2,1) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(2,1,1) gg::edgeEnd set dom(3) [gg::domEnd] gg::domBegin -type STRUCTURED gg::edgeBegin gg::edgeAddCon $con(0,2,0) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(0,0,2) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(0,2,1) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(0,1,2) gg::edgeEnd set dom(4) [gg::domEnd] gg::domBegin -type STRUCTURED gg::edgeBegin gg::edgeAddCon $con(1,2,0) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(1,0,2) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(1,2,1) gg::edgeEnd gg::edgeBegin gg::edgeAddCon $con(1,1,2) gg::edgeEnd set dom(5) [gg::domEnd] gg::blkBegin gg::faceBegin gg::faceAddDom $dom(0) gg::faceEnd gg::faceBegin gg::faceAddDom $dom(1) gg::faceEnd gg::faceBegin gg::faceAddDom $dom(2) gg::faceEnd gg::faceBegin gg::faceAddDom $dom(3) gg::faceEnd gg::faceBegin gg::faceAddDom $dom(4) gg::faceEnd gg::faceBegin gg::faceAddDom $dom(5) gg::faceEnd gg::blkEnd }] == 1 } { #Delete everything that was created tk_messageBox -icon error -title "Error..." -message "Could not create a block with these min max coordinates. All intermediate entities will be deleted." -type ok catch { gg::conDelete $con(0,0,2) } catch { gg::conDelete $con(0,1,2) } catch { gg::conDelete $con(1,0,2) } catch { gg::conDelete $con(1,1,2) } catch { gg::conDelete $con(0,2,0) } catch { gg::conDelete $con(1,2,0) } catch { gg::conDelete $con(0,2,1) } catch { gg::conDelete $con(1,2,1) } catch { gg::conDelete $con(2,0,0) } catch { gg::conDelete $con(2,1,0) } catch { gg::conDelete $con(2,0,1) } catch { gg::conDelete $con(2,1,1) } catch { gg::domDelete $dom(0) } catch { gg::domDelete $dom(1) } catch { gg::domDelete $dom(2) } catch { gg::domDelete $dom(3) } catch { gg::domDelete $dom(4) } catch { gg::domDelete $dom(5) } } return 1; } proc isCoordinate { str } { global errorCode set a "?" set x "?" set y "?" set z "?" set re {^\s*([-.eE0-9]+)[, ]+([-.eE0-9]+)[, ]+([-.eE0-9]+)\s*$} catch { regexp $re $str a x y z } if {[string is double $x] == 0 || [string is double $y] == 0 || \ [string is double $z] == 0 } { set st 0 } else { set st 1 } return $st } proc checkCoordinateInput { w var text action } { global BrickBlock # Ignore force validations if {$action == -1} { return 1 } if {![isCoordinate $text]} { set BrickBlock($var) 0 $w configure -bg "#FFCCCC" } else { set BrickBlock($var) 1 $w configure -bg "#FFFFFF" } checkInputStatus return 1 } proc checkIntegerInput { w var text action } { global BrickBlock # Ignore force validations if {$action == -1} { return 1 } if {![string is integer $text] || 2 > $text} { set BrickBlock($var) 0 $w configure -bg "#FFCCCC" } else { set BrickBlock($var) 1 $w configure -bg "#FFFFFF" } checkInputStatus return 1 } proc makeInputField { parent name title variable {width 7} {valid ""}} { frame $parent.$name label .lbl$name -text $title entry .ent$name -textvariable $variable -width $width if { [string compare $valid ""]!=0 } { .ent$name configure -validate all .ent$name configure -validatecommand $valid } pack ".lbl$name" -side left -padx 3 -pady 1 -in $parent.$name pack ".ent$name" -side right -padx 3 -pady 1 -in $parent.$name return $parent.$name } proc create { } { global xyz1 xyz2 dimi dimj dimk set re {^\s*([-.eE0-9]+)[, ]+([-.eE0-9]+)[, ]+([-.eE0-9]+)\s*$} regexp $re $xyz1 a x y z regexp $re $xyz2 a x1 y1 z1 return [makeRectangularPrism $x $y $z $x1 $y1 $z1 $dimi $dimj $dimk] } proc makeWindow { } { global BrickBlock label .title -text "Draw Brick Block" set font [.title cget -font] .title configure -font [font create -family [font actual $font -family] -weight bold] pack .title -expand 1 -side top pack [frame .hr1 -relief sunken -height 2 -bd 1] -side top -padx 2 -fill x -pady 1 pack [frame .inputs] -fill x -padx 2 pack [makeInputField .inputs coord1 "Pt (1,1,1):" xyz1 7 [list checkCoordinateInput %W xyz1 %P %d]] -fill x pack [makeInputField .inputs coord2 "Pt (I,J,K):" xyz2 7 [list checkCoordinateInput %W xyz2 %P %d]] -fill x pack [makeInputField .inputs di "Dimension-i:" dimi 7 [list checkIntegerInput %W iDim %P %d]] -fill x pack [makeInputField .inputs dj "Dimension-j:" dimj 7 [list checkIntegerInput %W jDim %P %d]] -fill x pack [makeInputField .inputs dk "Dimension-k:" dimk 7 [list checkIntegerInput %W kDim %P %d]] -fill x pack [frame .hr2 -relief sunken -height 2 -bd 1] -side top -padx 2 -fill x -pady 1 pack [frame .buttons] -fill x -padx 2 -pady 1 pack [button .buttons.cancel -text "Cancel" -command { exit }] -side right -padx 2 pack [button .buttons.ok -text "OK" -command {create; exit;}] -side right -padx 2 set BrickBlock(okButton) .buttons.ok set BrickBlock(xyz1) 1 set BrickBlock(xyz2) 1 set BrickBlock(iDim) 1 set BrickBlock(jDim) 1 set BrickBlock(kDim) 1 if {![catch {pwiLogoCreate .buttons.logo 1} b]} { $b configure -bd 0 -relief flat pack $b -side left -padx 5 -fill y } bind . { create exit } } makeWindow ::tk::PlaceWindow . widget gg::tkLoop # # DISCLAIMER: # TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, POINTWISE DISCLAIMS # ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED # TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE, WITH REGARD TO THIS SCRIPT. TO THE MAXIMUM EXTENT PERMITTED # BY APPLICABLE LAW, IN NO EVENT SHALL POINTWISE BE LIABLE TO ANY PARTY # FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES # WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF # BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE # USE OF OR INABILITY TO USE THIS SCRIPT EVEN IF POINTWISE HAS BEEN # ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND REGARDLESS OF THE # FAULT OR NEGLIGENCE OF POINTWISE. #