gmoffread.tcl

来自「算断裂的」· TCL 代码 · 共 157 行

TCL
157
字号
proc gm_offread_getline {fi} {    global gm_offread_linecount    while 1 {	set rval [gets $fi line]	incr gm_offread_linecount	if {$rval < 0} {	    error "Unexpected eof while reading file"	}	set line [string trim $line]	if {[string length $line] > 0} {	    if {[string range $line 0 0] != "#"} {		return $line	    }	}    }}proc gmoffread {filename {tol ""}} {    # gmset brep [gmoffread filename]    # This routine reads a brep in OFF format from a file.    # See the documentation for a description of OFF format.    # OFF format was developed at the University of Minnesota    # Geometry Center.    if {$tol == ""} {	global gm_default_tol	set tol $gm_default_tol    }    global gm_offread_linecount    global gm_brep_type_code    set gm_offread_linecount 0    set fi [open $filename r]    set filetype [string tolower [gm_offread_getline $fi]]    if {$filetype != "off" && $filetype != "off\r"} {	error "File must begin with header word 'OFF'"    }    set count [scan [gm_offread_getline $fi] \	    "%d %d %d" numvtx numfacet numedge]    if {$count != 3} {	error "Second line of file must contain three integers"    }    set cplist {}    set vlist {}    for {set vnum 0} {$vnum < $numvtx} {incr vnum} {	set count [scan [gm_offread_getline $fi] "%e %e %e" x y z]	if {$count != 3} {	    error "Each vertex line must contain three coordinates (error on line $gm_offread_linecount)"	}	lappend cplist $x $y $z	lappend vlist v$vnum {} {} {} [list [list vertex $vnum]]    }    set elist {}    set slist {}    set rbdry {}    for {set fnum 0} {$fnum < $numfacet} {incr fnum} {	set fdesc [gm_offread_getline $fi]	set numv [lindex $fdesc 0]	if {[llength $fdesc] == $numv + 1} {	    set color {}	} elseif {[llength $fdesc] == $numv + 4} {	    set color [lrange $fdesc [expr $numv + 1] end]	} else {	    error "Wrong number of entries in polygon (error on line $gm_offread_linecount)"	}#	puts "before trunc numv = $numv fdesc = $fdesc"	for {set j1 0} {$j1 < $numv - 1} {incr j1} {	    if {[lindex $fdesc [expr $j1+1]]==[lindex $fdesc [expr $j1+2]]} {		set fdesc [concat [lrange $fdesc 0 [expr $j1 + 1]] \			[lrange $fdesc [expr $j1+3] end]]		incr numv -1	    }	}#	puts "after trunc numv = $numv rbdry = $rbdry"	set sbdry {}	set thisvlist {}	set thiselist {}	for {set k 0} {$k < $numv} {incr k} {	    set v1 [lindex $fdesc [expr $k + 1]]	    set nextk [expr ($k == $numv - 1)? 0 : $k + 1]	    set v2 [lindex $fdesc [expr $nextk + 1]]	    lappend thisvlist [lrange $cplist [expr 3 * $v1] \		    [expr 3 * $v1 + 2]]	    lappend thiselist [list $k $nextk]	    if {$v2 < $v1} {		set tmp $v1		set v1 $v2		set v2 $tmp	    }	    if {[catch {incr ecount($v1,$v2)}]} {		set ecount($v1,$v2) 1		set topidx [expr [llength $elist] / 5] 		set ehash($v1,$v2) $topidx		lappend elist e$topidx {} [list v$v1 v$v2] {} \			[list [list bezier_curve 1 $v1 $v2]]	    } else {		set topidx $ehash($v1,$v2)	    }	    lappend sbdry e$topidx	}	set trilist [gm_polytri $thisvlist $thiselist $tol]	set bezlist {}	foreach tri $trilist {	    set bez {bezier_triangle 1}	    for {set p 0} {$p < 3} {incr p} {		set k [lindex $tri $p]		set v [lindex $fdesc [expr $k + 1]]		lappend bez $v	    }	    lappend bezlist $bez	}	lappend slist s$fnum	if {[llength $color] == 0} {	    lappend slist {}	} else {	    lappend slist [list color ([lindex $color 0] \		    [lindex $color 1] [lindex $color 2] 1)]	}	lappend slist $sbdry	lappend slist {}	lappend slist $bezlist	lappend rbdry s$fnum    }    set alle [array names ecount]    set emit2d 0    foreach item $alle {	if {$ecount($item) != 2} {	    puts "Boundary does not close: edge $item is contained by $ecount($item) polygon(s) (should be 2)"	    set emit2d 1	}    }    if {$emit2d} {	puts "Because boundary does not close, returned brep has no regions"	set brep [list $gm_brep_type_code 2 3 {} $cplist $vlist $elist $slist]    } else {	set rlist [list region {} $rbdry {} {}]	set brep [list $gm_brep_type_code 3 3 {} $cplist $vlist $elist $slist $rlist]    }    return [gm_list2obj $brep]}# ------------------------------------------------------------------# Copyright (c) 1999 by Cornell University.  All rights reserved# See the accompanying file 'Copyright' for authorship information,# the terms of the license governing this software, and disclaimers# concerning this software.# ------------------------------------------------------------------# This file is part of the QMG software.  # Version 2.0 of QMG, release date September 3, 1999# ------------------------------------------------------------------

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?