Author Topic: read-line and data storage?  (Read 10595 times)

0 Members and 1 Guest are viewing this topic.

CAB

  • Global Moderator
  • Seagull
  • Posts: 10401
read-line and data storage?
« on: February 10, 2004, 03:10:42 PM »
I'm building a group of Files to hold my common text that will be inserted
via a routine I have written. The data was hard coded but I want to put it
text files. This is my first file IO routine so I would appreciate comments
on how it could be improved. Or how to better organize the data.

Code: [Select]
(defun c:frtest (); File Read Test Routine

;;; -=<*>=- -=<*>=- -=<*>=- -=<*>=- -=<*>=- -=<*>=- -=<*>=- -=<*>=-
;;;                      Local Functions                          
;;; -=<*>=- -=<*>=- -=<*>=- -=<*>=- -=<*>=- -=<*>=- -=<*>=- -=<*>=-
;;;
;;;================================================================
;;;                  Read the file Header                          
;;;================================================================
  (defun file_read_header ()
    (setq lp 7 ; number of data lines expected
 header (list) ; collection of data
 lc 0 ; lines read counter
    )
    (while (> lp 0)
      (setq ln (read-line fn); get a line from file
   lc (1+ lc)
      )
      (if ln ; nil if eof
(progn
 (cond
   ;;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   ;;  Filter out
   ((or (= 0 (vl-string-search ";" ln)) ; lines starting with ;
(= (vl-string-left-trim " " ln) "") ; empty lines
    )
    () ; IGNORE LINES STARTING WITH ; or space
   ) ; end cond
   ;;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   ;;  Catch Headers & verify line count
   ((= 0 (vl-string-search "*****" ln))
    (if (or (= lp 7) (= lp 1))
      (setq lp (1- lp))
      (setq error_flag "Number of data lines Incorrect.")
    )
   ) ; end cond
   ;;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   ;;  catch any line not filtered, add to list
   (t
    (setq header (cons ln header))
    (setq lp (1- lp))
   ) ; end cond
   ;;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 ) ; end cond stmt
) ; end progn
(progn
 (setq error_flag "End of File Error."
lp 0)
)
      ) ; endif

    ) ; end while
    (setq header (reverse header))
    (null error_flag); return nil if error
  ) ; end defun

;;;================================================================
;;;                  Read the file Body                            
;;;================================================================
  (defun file_read_list ()
    ;; Unknown Number of Lines
    ;; start & end with line =  ***Text
    (setq text_list (list)
 text_Item (list)) ; empty list
    (setq lp T)
    (while lp
      (setq ln (read-line fn); get a line from file
   lc (1+ lc)
      )
      (if ln
(progn
 (cond
   ;;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   ;;  Filter out
   ((or (= 0 (vl-string-search ";" ln)) ; lines starting with ;
(= (vl-string-left-trim " " ln) "") ; empty lines
    )
    () ; IGNORE LINES STARTING WITH ; or space
   ) ; end cond
   ;;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   ;;  Catch Headers
   ((vl-string-search "***Text" ln)
    (if (and(=(length text_list)0)(=(length Text_Item)0))
      ()
      (progn ;add item list to main list
      (setq text_list (cons (reverse text_item) text_list)
    text_item (list); reset item
    )
      )          
    ); end if
   ) ; end cond
   ;;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   ;;  catch any line not filtered, add to list
   (t
    (setq text_Item (cons ln Text_Item))
   ) ; end cond
   ;;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 ) ; end cond stmt
); end progn
(progn
 (if text_item ; no end of Header line found
   (setq error_flag "End of File Error.")
 )
 (setq lp nil)
)
      ); end if ln
     ); end while

  ) ; end defun

;;; -=<*>=- -=<*>=- -=<*>=- -=<*>=- -=<*>=- -=<*>=- -=<*>=- -=<*>=-
;;;================================================================
;;;                    Start of Routine                            
;;;================================================================
;;; -=<*>=- -=<*>=- -=<*>=- -=<*>=- -=<*>=- -=<*>=- -=<*>=- -=<*>=-
  (setq error_flag nil)
  (if (setq fn (findfile "Foundation.txt"))
    (progn
      (setq fn (open fn "r")) ; open file for reading
      (if (file_read_header) ; header ok?
(if (file_read_list) ; list is ok?
 ()
) ; end if
      ) ; end if
      (close fn) ; close the open file handle
    ) ; end progn
    (alert "\nFile " fn " not found\n")
  ) ; endif fn
  (if error_flag
    (alert error_flag)
  )
  (princ)
) ; end defun frtest

;;;//////////
;;;  EOF
;;;\\\\\\\\\\



Data in a Text File

Code: [Select]
;  File comment line start line with ;
;  comments in data lines are not supported
;  blank lines are ignored
;
;;;  *****Header Section, start & end with this line
;;;   File Referance Name
;;;   typinp ; Input type 1=char ,2=char, 3=char, 0= cr required
;;;   eoechr ; End Of Entry characters (Space & CR are standard)
;;;   mtflag ; Mtext flag, T= Mtext, nil = Dtext to insert
;;;   helpsld ; name of the help slide
;;;  *****Header Section
*****Header Section (5 Data Lines)
Foundation
0
nil
0
HelpFoundation.sld
*****Header Section
;
;;;   ***Text Item, start & end with this line
;;;   Hot key(s)
;;;   Flag for type of insertion, optional
;;;           if omitted default to 1
;;;           0= Text @ angle 0
;;;           1= Text @ user angle
;;;           2= insert with leader
;;;   Text line by line
;;;   ***Text Item
***Text Item (Unknown Number of Lines)
F16
2
16" x 8" FOOTING
W/ (2) #5 REBAR
ON WIRE CHAIRS
***Text Item
F20
2
20" x 10" FOOTING
W/ (3) #5 REBAR
ON WIRE CHAIRS
***Text Item
F24
2
24" x 12" FOOTING
W/ (3) #5 REBAR
ON WIRE CHAIRS
***Text Item
P30
2
30" X 30" X 12" DEEP
CONC. FOOTING PAD
W/ (3) #5~ E.W. (TYP.)
***Text Item
P36
2
36" X 36" X 12" DEEP
CONC. FOOTING PAD
W/ (3) #5~ E.W. (TYP.)
***Text Item
P48
2
48" X 48" X 12" DEEP
CONC. FOOTING PAD
W/ (5) #5~ E.W. (TYP.)
***Text Item
P60
2
60" X 60" X 12" DEEP
CONC. FOOTING PAD"
W/ (6) #5~ E.W. (TYP.)
***Text Item
BW
2
12"Dx16"W w/2-#5 BARS CONT.
& 1/2"~ A.B. @ 48" O.C. TYP
***Text Item
FS  
0
A FOUNDATION SURVEY SHALL BE PERFORMED
AND A COPY OF THE SURVEY SHALL BE ON THE
SITE FOR THE BUILDING INSPECTOR'S USE, OR
ALL PROPERTY MARKERS SHALL BE EXPOSED AND
A STRING STRECHED FROM MARKER TO MARKER
TO VERIFY REQUIRED SETBACKS.
***Text Item
SLB
0
4" 2500 PSI CONCRETE SLAB W/6X6
#1010 WWM OR W/ FIBERMESH 1.5#/CU.YD.
OVER .006 POLY VAPOR BARRIER SEALED
AT ALL PENATRATIONS MECHANICALLY
COMPACT SOIL TERMITE TREAT SOIL
***Text Item
I've reached the age where the happy hour is a nap. (°¿°)
Windows 10 core i7 4790k 4Ghz 32GB GTX 970
Please support this web site.

Serge J. Gianolla

  • Guest
read-line and data storage?
« Reply #1 on: February 10, 2004, 06:07:23 PM »
Hey CAB
Pretty impressive that answer to Water Bear, I expect you are dutifully slaving on Straight Skeleton formula now :roll:

When reading a file with unknow number of elements, I use:
Code: [Select]
 (while (boundp 'lln)
  (setq Lln (read-line File2))
   (if lln
   ...

I try to make sure all elements belonging to each other are on same line [less jumping to read-line...] using a separator like pipe line or comma...
so to use one of your samples:
F16|2|16" x 8" FOOTING|W/ (2) #5 REBAR|ON WIRE CHAIRS

Code: [Select]
;;; Parameters:
;;; Str String to parse
;;; Delimiter Delimiter to search for
;;;------------------------------------------------------------------
;;; Returns:
;;; A list strings.
;;; ex:
;;; (setq a "Harp,Guiness,Black and Tan")
;;; (StrParse a ",")
;;; returns:
;;; ("Harp" "Guiness" "Black and Tan")
(defun strParse (Str Delimiter / SearchStr StringLen return n char)
  (setq SearchStr Str)
  (setq StringLen (strlen SearchStr))
  (setq return '())
  (while (> StringLen 0)
    (setq n 1)
    (setq char (substr SearchStr 1 1))
    (while (and (/= char Delimiter) (/= char ""))
      (setq n (1+ n))
      (setq char (substr SearchStr n 1))
    ) ;_ end of while
    (setq return (cons (substr SearchStr 1 (1- n)) return))
    (setq SearchStr (substr SearchStr (1+ n) StringLen))
    (setq StringLen (strlen SearchStr))
  ) ;_ end of while
  (reverse return)
) ;_ end of defun


Using the string parser routine [think from acadx] we pass along to a variable:
Code: [Select]
 (setq data (strParse data "|"))
Then finally, instead of doing multiple calls to Setqs:
Code: [Select]
 (mapcar 'set '(depth width thick web rad) data)

CAB

  • Global Moderator
  • Seagull
  • Posts: 10401
read-line and data storage?
« Reply #2 on: February 10, 2004, 08:07:51 PM »
Serge,
Thanks for the advice, and the kind words.

I'll, rethink my data structure.
I must find more uses for the mapcar function, I've not used it
enough to be aware of all it's flexibility.

Believe it or not, I haven't given up on the skeleton, but at a
temporary impasse. I find I have to put things down for a while
and revisit them with a fresh outlook. I think it can be done but
with how much compromise is the question. Settling for some
inadequacies in the routine that is.

CAB
I've reached the age where the happy hour is a nap. (°¿°)
Windows 10 core i7 4790k 4Ghz 32GB GTX 970
Please support this web site.

CAB

  • Global Moderator
  • Seagull
  • Posts: 10401
read-line and data storage?
« Reply #3 on: February 10, 2004, 09:24:54 PM »
In my search earlier today I found a couple of phraser routines
similar to the one you posted. I tried to adapt it to mapcar
and/or lambda but I don't have it yet. I was able to condense
the phraser to this.

Code: [Select]
(defun sparser (str delim / ptr lst)
  (while (setq ptr (vl-string-search delim str))
    (setq lst (cons (substr str 1 ptr) lst))
    (setq str (substr str (setq ptr (+ ptr 2))(strlen str)))
  )
  (setq lst (reverse(cons str lst)))
)


(defun c:test ()
  (setq new_list(sparser "123||abc|def" "|"))
  (princ)
)
(princ)
I've reached the age where the happy hour is a nap. (°¿°)
Windows 10 core i7 4790k 4Ghz 32GB GTX 970
Please support this web site.

Anonymous

  • Guest
read-line and data storage?
« Reply #4 on: February 10, 2004, 10:18:05 PM »
C 8) :D L man!

Code: [Select]
(defun c:test ()
  (setq new_list(sparser "123||abc|def" "|"))
  (princ)
)

OK, don't know if that was meant to be double symbol but after running test
(mapcar 'set '(depth width thick web rad) new_list)
now returns
Command: !depth
"123"

Command: !width
""

Command: !thick
"abc"

Command: !web
"def"

Command: !rad
nil

Have fun!

Serge J. Gianolla

  • Guest
read-line and data storage?
« Reply #5 on: February 10, 2004, 10:20:34 PM »
Mark or anyone, I was logged in when answering to CAB, but again [not the first time] she goes bonkers on me. Ideas :idea:

daron

  • Guest
read-line and data storage?
« Reply #6 on: February 10, 2004, 11:54:40 PM »
That's an odd one, Serge.

Serge J. Gianolla

  • Guest
read-line and data storage?
« Reply #7 on: February 11, 2004, 01:05:41 AM »
Thanx Daron, but I am well known for my  ... oddity :wink:

hendie

  • Guest
read-line and data storage?
« Reply #8 on: February 11, 2004, 03:15:12 AM »
Quote from: Serge J. Gianolla
Thanx Daron, but I am well known for my  ... oddity :wink:


you won't feel out of sorts with the company here then Serge !  :P

SMadsen

  • Guest
read-line and data storage?
« Reply #9 on: February 11, 2004, 05:06:29 AM »
CAB, just realized I still have a webpage around with a routine I wrote a couple of years back. Basically it just reads from a file containing sysvar information and provides a dlg to search, read and set sysvars - as well as getting info on each (hey, it even has some undocumented sysvars - just search on "undocumented" :) )

Even though it's a bit old and the string handling routines could use an overhaul, I thought it might be of interest to you.
The lsp, dcl and txt files are at http://intervision.hjem.wanadoo.dk/sysvardlg.htm

SMadsen

  • Guest
read-line and data storage?
« Reply #10 on: February 11, 2004, 05:17:18 AM »
Oh by the way, have you considered using XML for your common text, CAB?

Mark

  • Custom Title
  • Seagull
  • Posts: 28762
read-line and data storage?
« Reply #11 on: February 11, 2004, 07:54:22 AM »
Basically when you read your file you are looking for this?
Code: [Select]

***Text Item
F20
2
20" x 10" FOOTING
W/ (3) #5 REBAR
ON WIRE CHAIRS
TheSwamp.org  (serving the CAD community since 2003)

CAB

  • Global Moderator
  • Seagull
  • Posts: 10401
read-line and data storage?
« Reply #12 on: February 11, 2004, 08:05:39 AM »
Serge,
That mapcar function works great :)  realy neat...I didn't get it the first goround.
Yes I had the double pipe to see what it would return I to see if it would crash the
routines, it did not & returned as expected an empty string.

Stig,
Wow, just down loaded the sys var routine and i'll check it out. The dialog box
is well laid out , looks great. I'll dive ito the code today.  I've downloaded from you site
several times in the past, but as I grow in lisp terms I need to revisit there as you pointed out.
I have left you url & the swamp several times (@ autodesk) when people ask how to get started lisping.

XML?  You know I should have kept reading that thread but being time crunched & see no
immmediate need I put it on the back burner & obviously forgot about it :oops:
Just what I need more homework... :)

I'll be back.......CAB
I've reached the age where the happy hour is a nap. (°¿°)
Windows 10 core i7 4790k 4Ghz 32GB GTX 970
Please support this web site.

CAB

  • Global Moderator
  • Seagull
  • Posts: 10401
read-line and data storage?
« Reply #13 on: February 11, 2004, 08:19:55 AM »
Yes Mark.

Code: [Select]
***Text Item    <--  Start if section marker
F20                <--  Short cut phrase]
2                     <--  Code indicating insert with leader
20" x 10" FOOTING      <--   Text to insert, unknown number of lines
W/ (3) #5 REBAR
ON WIRE CHAIRS
***Text Item              <--- End of section marker & Start for next text
                                         unless EOF


That was the plan. But as Serge pointed out the data could be phrased something like this.

Code: [Select]

[Text Header]|F20|2|future codes
[Text Body]|20" x 10" FOOTING|W/ (3) #5 REBAR|ON WIRE CHAIRS


This would reduce the number of read-lines and be quicker but with a small file like this
The read time should not be a factor, also the phrasing may be more difficult for the
user to keep up with (minor issue) as I planed on the text file to be user created, not by a routine.

CAB
I've reached the age where the happy hour is a nap. (°¿°)
Windows 10 core i7 4790k 4Ghz 32GB GTX 970
Please support this web site.

SMadsen

  • Guest
read-line and data storage?
« Reply #14 on: February 11, 2004, 09:57:13 AM »
I pondered Serge's statement "less jumping to read-line..." a bit and, just for the fun of it (yeah, I'm a nerd!) made some testing on parsing lines versus reading single lines. Here's what I came up with when timing each method:

_$ (repeat 10 (doParse))
Timed readParse: 0.749986
Timed readParse: 0.750026
Timed readParse: 0.764993
Timed readParse: 0.750026
Timed readParse: 0.764993
Timed readParse: 0.749986
Timed readParse: 0.765999
Timed readParse: 0.749986
Timed readParse: 0.765999
Timed readParse: 0.749986

_$ (repeat 10 (doLines))
Timed readLines: 0.84397
Timed readLines: 0.844011
Timed readLines: 0.859983
Timed readLines: 0.84397
Timed readLines: 0.827998
Timed readLines: 0.844011
Timed readLines: 0.844011
Timed readLines: 0.844011
Timed readLines: 0.844011
Timed readLines: 0.84397

_$ (repeat 10 (doLines)(doParse))
Timed readLines: 0.84397
Timed readParse: 0.765999
Timed readLines: 0.827998
Timed readParse: 0.764993
Timed readLines: 0.827998
Timed readParse: 0.765999
Timed readLines: 0.84397
Timed readParse: 0.749986
Timed readLines: 0.844011
Timed readParse: 0.765999
Timed readLines: 0.827998
Timed readParse: 0.766039
Timed readLines: 0.844011
Timed readParse: 0.765999
Timed readLines: 0.844011
Timed readParse: 0.764993
Timed readLines: 0.827998
Timed readParse: 0.765999
Timed readLines: 0.844011
Timed readParse: 0.764993
_$

Conclusion must be that "jumping" read-line's is actually slower than reading fewer lines and parsing each?

Of course, the code that was used may not be the most optimized code around.
Basically, readLines uses a file arranged like CAB's - headers and data on separate lines. ReadParse uses a file arranged in the way suggested by Serge - headers and data on same lines, separated by "|".

Code and files below.

Code: [Select]
(defun readParse (name / fn ln header mainList )
  (cond ((setq name (findfile name))
         (setq fn (open name "r"))
         (while (setq ln (read-line fn))
           (cond ((= 0 (vl-string-search "****" ln))
                  (setq header (cdr (strParse ln "|")))
                 )
                 ((= 0 (vl-string-search "***Text" ln))
                  (setq mainList (cons (cdr (strParse ln "|")) mainList))
                 )
           )
         )
         (close fn)
        )
  )
  (list header (reverse mainList))
)

(defun readLines (name / inHeader)
  (setq txtList nil
        mainList nil
        header nil
  )
  (cond ((setq name (findfile name))
         (setq fn (open name "r"))
         (while (setq ln (read-line fn))
           ;;(princ ln)
           (cond ((= (substr ln 1 1) ";"))
                 ((= 0 (vl-string-search "****" ln))
                  (setq inHeader (not inHeader))
                 )
                 (inHeader
                  (setq header (cons ln header))
                 )
                 ((= 0 (vl-string-search "***Text" ln))
                  (if txtList
                    (setq mainList (cons (reverse txtList) mainList))
                  )
                  (setq txtList nil)
                 )
                 ((setq txtList (cons ln txtList)))
           )
         )
         (close fn)
        )
  )
  (list (reverse header) (reverse mainList))
)

;;; The parse function used in readParse
(defun strParse (aStr delim / strList pos)
  (while (setq pos (vl-string-search delim aStr 0))
    (setq strList (cons (substr aStr 1 POS) strList)
          aStr    (substr aStr (+ pos 2))
    )
  )
  (reverse (cons aStr strList))
)

;;; Timer functions
(defun doParse ()
  (startTimer)
  (repeat 100
    (readParse "parsetest.txt")
  )
  (endTimer "readParse")
)

(defun doLines ()
  (startTimer)
  (repeat 100
    (readLines "readtest.txt")
  )
  (endTimer "readLines")
)

(defun startTimer ()
  (setq time (getvar "DATE"))
)
(defun endTimer (func)
  (setq time    (- (getvar "DATE") time)
        seconds (* 86400.0 (- time (fix time)))
  )
  (gc)
  (outPut seconds func)
)
(defun outPut (secs def)
  (gc)
  (princ (strcat "\nTimed " def ": " (rtos secs 2 6)))
  (princ)
)


The text files was as below, but shown here without comments to save space. When the routines were run, it was including the comments.

parsetest.txt file (last two lines split up for display only)
Code: [Select]

*****Header Section|Foundation|0|nil|0|HelpFoundation.sld

***Text Item|F16|2|16" x 8" FOOTING|W/ (2) #5 REBAR|ON WIRE CHAIRS
***Text Item|F20|2|20" x 10" FOOTING|W/ (3) #5 REBAR|ON WIRE CHAIRS
***Text Item|F24|2|24" x 12" FOOTING|W/ (3) #5 REBAR|ON WIRE CHAIRS
***Text Item|P30|2|30" X 30" X 12" DEEP|CONC. FOOTING PAD|W/ (3) #5~ E.W. (TYP.)
***Text Item|P36|2|36" X 36" X 12" DEEP|CONC. FOOTING PAD|W/ (3) #5~ E.W. (TYP.)
***Text Item|P48|2|48" X 48" X 12" DEEP|CONC. FOOTING PAD|W/ (5) #5~ E.W. (TYP.)
***Text Item|P60|2|60" X 60" X 12" DEEP|CONC. FOOTING PAD"|W/ (6) #5~ E.W. (TYP.)
***Text Item|BW|2|12"Dx16"W w/2-#5 BARS CONT.|& 1/2"~ A.B. @ 48" O.C. TYP
***Text Item|FS|0|A FOUNDATION SURVEY SHALL BE PERFORMED|AND A COPY OF THE SURVEY
   SHALL BE ON THE|SITE FOR THE BUILDING INSPECTOR'S USE, OR|ALL PROPERTY MARKERS
   SHALL BE EXPOSED AND|A STRING STRECHED FROM MARKER TO MARKER|TO VERIFY REQUIRED
   SETBACKS.
***Text Item|SLB|0|4" 2500 PSI CONCRETE SLAB W/6X6|#1010 WWM OR W/ FIBERMESH 1.5
   #/CU.YD.|OVER .006 POLY VAPOR BARRIER SEALED|AT ALL PENETRATIONS
   MECHANICALLY|COMPACT SOIL TERMITE TREAT SOIL



readtest.txt file
Code: [Select]

*****Header Section (5 Data Lines)
Foundation
0
nil
0
HelpFoundation.sld
*****Header Section

***Text Item (Unknown Number of Lines)
F16
2
16" x 8" FOOTING
W/ (2) #5 REBAR
ON WIRE CHAIRS
***Text Item
F20
2
20" x 10" FOOTING
W/ (3) #5 REBAR
ON WIRE CHAIRS
***Text Item
F24
2
24" x 12" FOOTING
W/ (3) #5 REBAR
ON WIRE CHAIRS
***Text Item
P30
2
30" X 30" X 12" DEEP
CONC. FOOTING PAD
W/ (3) #5~ E.W. (TYP.)
***Text Item
P36
2
36" X 36" X 12" DEEP
CONC. FOOTING PAD
W/ (3) #5~ E.W. (TYP.)
***Text Item
P48
2
48" X 48" X 12" DEEP
CONC. FOOTING PAD
W/ (5) #5~ E.W. (TYP.)
***Text Item
P60
2
60" X 60" X 12" DEEP
CONC. FOOTING PAD"
W/ (6) #5~ E.W. (TYP.)
***Text Item
BW
2
12"Dx16"W w/2-#5 BARS CONT.
& 1/2"~ A.B. @ 48" O.C. TYP
***Text Item
FS
0
A FOUNDATION SURVEY SHALL BE PERFORMED
AND A COPY OF THE SURVEY SHALL BE ON THE
SITE FOR THE BUILDING INSPECTOR'S USE, OR
ALL PROPERTY MARKERS SHALL BE EXPOSED AND
A STRING STRECHED FROM MARKER TO MARKER
TO VERIFY REQUIRED SETBACKS.
***Text Item
SLB
0
4" 2500 PSI CONCRETE SLAB W/6X6
#1010 WWM OR W/ FIBERMESH 1.5#/CU.YD.
OVER .006 POLY VAPOR BARRIER SEALED
AT ALL PENETRATIONS MECHANICALLY
COMPACT SOIL TERMITE TREAT SOIL
***Text Item