Carry WordPress in your Pocket : USB WebserverSo that may be I can experiment with custom themes, and otherwise building a website. At moment not sure I like having a blog as the main page to website, but then not sure what alternative to put there. Though I don't need a web server to test the alternatives: unless create a static home page in WordPress.
A journal on everything technological and everything to do with structure: from building structures, to organisation structures, politics, education, and business. If it has structure I will essay it, if it ought to have structure I will essay it. If it don't have structure and it is chaos, I essay that too!
Tuesday, December 31, 2013
Installed wordpress on usb memory stick
Installed WordPress on a usb memory stick by making use of usbwebserver and part following guidelines from the following blog:
FreeDOS and Ubuntu on Asus EEE PC Netbook
Accidentally killed MS Windows XP on my netbook. Used Partition Magic 8 to create partitions on my Netbook. All seemed to be going fine, then turned out that it wasn't. I got the netbook a while back now, the general idea was hopeful expectation that it would boot faster than Windows XP laptop, if it didn't then I would install MS DOS (Assuming I could figure out how to get around it being on 3.5" floppy disks) At the time I downloaded FreeDOS and Unbuntu for netbooks, but never got round to installing. Though I did burn CD's and otherwise load Ubuntu onto a bootable usb memory stick/flashdrive which was useful for fixing MS Windows problems. Also at the time I managed to network the netbook with my laptop share the laptop CD drive and install Powerquest Partition Magic on the netbook, though Bootmagic didn't seem to install. Any case problem was only allowed to have 4 primary drives and the netbook already had so I didn't pursue any further: primarily because have no Windows XP disks to re-install the system. On top of which at the time didn't fully understand how to get the system back without installation disks: it seemed like needed to install over Internet or something. Instructions didn't seem clear, and I didn't have time to pursue further.
So this time round I took a closer look at the partitions and identified one of them as the recovery partition for Windows XP, this was after I removed its hidden status with Partition Magic, and rebooted and could see in windows explorer. After which I discovered I could have probably browsed the files in Partition Magic. Any how I proceeded to remove the 4 primary drives and create a single primary partition and an extended partition. In the extended partition I then set up swap partition and ext2 partition for Linux. That all seemed to go fine. I then installed Ubuntu netbook edition from the usb drive. That all seemed to go fine too. The grub bootloader was automatically setup, and allowed booting Windows XP, Ubuntu, and also the Win XP recovery drive. However I didn't like the Ubuntu netbook edition, as none of the user guides I could find gave instructions which matched the Unity desktop it used. For that matter one guide discussed a gnome desktop.
I did also install both FreeDOS and Ubuntu netbook edition in virtual machines on my 64 bit laptop using Oracle Virtual Box. It seemed to go fine. For that matter Ubuntu in the virtual box made a connection to the Internet and spent an hour or more downloading and installing upgrades. I thought these upgrades would change the desktop to match the more recent user guides but it didn't. Installing Ubuntu 12? into virtual box didn't go so smoothly. But then virtual box wanted to update. After Virtual Box update, and allowing more ram for Ubuntu the installation, with power supply, and Internet connection, the install went more smoothly. I also tried the 64 bit version of Ubuntu, that wasn't compatible. So things went relatively ok in virtual box: only problem with respect to FreeDOS was how do I get files and other software into the virtual machine. That seemed somewhat complicated: further no real value to using FreeDOS inside a virtual box under MS Windows 7. The real objective was to boot my netbook fast and otherwise install Turbo C and Turbo Pascal along with maybe Paradox, and take a look at some of my old programs. {As there are some memory problems running at the Windows Command Prompt}.
The real objective a fast DOS box for writing and number crunching: don't need all the fancy graphics, my HP 28S calculator doesn't have such. Switch a calculator on get straight to crunching numbers, switch a word processor on get straight to typing. Switch a Windows computer on, get straight to no where: all that power and flexibility is good but its not always appropriate.
So creating another partition for FreeDOS on my netbook was the next task: that's where I hit problems. Partition magic would no longer start, complaining about drive assignment. I ran Ubuntu from the flashdrive again and went through the install, its partitioner indicated that none of the drive was allocated.
I then downloaded and installed GParted on a Live CD. I ran that but had problems, didn't seem to have any touch pad or keyboard control: touch pad could move cursor but couldn't execute any commands or select anything. After booting and trying a few times, eventually it worked with mouse plugged into usb port. It confirmed that none of the drive was allocated. Hunting down this problem, seemed that the partitions overlapped or something similar. So whilst XP and Ubuntu didn't seem to mind, and seemed to run ok, the disk partitioner didn't like. I ran a program called TestDisk, that seemed to identify the problem, and could apparently fix the problem. That is where I did something wrong or missed something: as after the fix I lost the bootloader and thus access to everything. One dead netbook.
Well not entirely dead as the data obviously still there on each partitions. So that using Ubuntu from a Live CD and further use of TestDisk could probably get everything back and adjust the start and finish of each partition. But seemed all too hard. So I just adjusted the partitions on the hard disk, created a partition for FreeDOS and installed FreeDOS then installed the most recent stable version of Ubuntu, which created a new bootloader menu for both FreeDOS and Ubuntu. So my netbook can now run either FreeDOS or Ubuntu.
Though the partitions are still not right. FreeDOS complains about faulty partition starting at 1 MByte, but when using GParted such no longer shows up: though it did when I created the partition. For some reason it had 1 Mbyte of free space before the partition. I simply accepted this. As another thing I discovered is that there should be unallocated space between a primary partition and a extended/logical partition: I didn't do this at the beginning. I did do this when I created new partitions. I don't remember doing such several years back when I set up my desktop for Windows XP, MS DOS and Linux.
Part one of objective achieved the netbook boots into FreeDOS fast. Only problem now is getting data to and from the netbook. It doesn't have any CD Drive, nor floppy disks, only usb: and DOS doesn't recognise USB drives without additional software. Problem is how to get that additional software onto the FreeDOS drive if it doesn't recognise the usb flashdrive. For installation can boot to Unbuntu, it recognises the usb drive and the FreeDOS drive, and can therefore copy files across. For general operations however booting to Ubuntu for copying files not practical when objective is a fast booting device. So hopefully can get the USB drivers to work in FreeDOS. If can then that would be good.
Already copied Turbo C and "As Easy As" over to FreeDOS drive. So far only tested that they open. As Easy As is a Lotus 123 like spreadsheet: a relatively small program and cost considerably less than Lotus, but was mostly compatible with: so something to crunch numbers with.
So this time round I took a closer look at the partitions and identified one of them as the recovery partition for Windows XP, this was after I removed its hidden status with Partition Magic, and rebooted and could see in windows explorer. After which I discovered I could have probably browsed the files in Partition Magic. Any how I proceeded to remove the 4 primary drives and create a single primary partition and an extended partition. In the extended partition I then set up swap partition and ext2 partition for Linux. That all seemed to go fine. I then installed Ubuntu netbook edition from the usb drive. That all seemed to go fine too. The grub bootloader was automatically setup, and allowed booting Windows XP, Ubuntu, and also the Win XP recovery drive. However I didn't like the Ubuntu netbook edition, as none of the user guides I could find gave instructions which matched the Unity desktop it used. For that matter one guide discussed a gnome desktop.
I did also install both FreeDOS and Ubuntu netbook edition in virtual machines on my 64 bit laptop using Oracle Virtual Box. It seemed to go fine. For that matter Ubuntu in the virtual box made a connection to the Internet and spent an hour or more downloading and installing upgrades. I thought these upgrades would change the desktop to match the more recent user guides but it didn't. Installing Ubuntu 12? into virtual box didn't go so smoothly. But then virtual box wanted to update. After Virtual Box update, and allowing more ram for Ubuntu the installation, with power supply, and Internet connection, the install went more smoothly. I also tried the 64 bit version of Ubuntu, that wasn't compatible. So things went relatively ok in virtual box: only problem with respect to FreeDOS was how do I get files and other software into the virtual machine. That seemed somewhat complicated: further no real value to using FreeDOS inside a virtual box under MS Windows 7. The real objective was to boot my netbook fast and otherwise install Turbo C and Turbo Pascal along with maybe Paradox, and take a look at some of my old programs. {As there are some memory problems running at the Windows Command Prompt}.
The real objective a fast DOS box for writing and number crunching: don't need all the fancy graphics, my HP 28S calculator doesn't have such. Switch a calculator on get straight to crunching numbers, switch a word processor on get straight to typing. Switch a Windows computer on, get straight to no where: all that power and flexibility is good but its not always appropriate.
So creating another partition for FreeDOS on my netbook was the next task: that's where I hit problems. Partition magic would no longer start, complaining about drive assignment. I ran Ubuntu from the flashdrive again and went through the install, its partitioner indicated that none of the drive was allocated.
I then downloaded and installed GParted on a Live CD. I ran that but had problems, didn't seem to have any touch pad or keyboard control: touch pad could move cursor but couldn't execute any commands or select anything. After booting and trying a few times, eventually it worked with mouse plugged into usb port. It confirmed that none of the drive was allocated. Hunting down this problem, seemed that the partitions overlapped or something similar. So whilst XP and Ubuntu didn't seem to mind, and seemed to run ok, the disk partitioner didn't like. I ran a program called TestDisk, that seemed to identify the problem, and could apparently fix the problem. That is where I did something wrong or missed something: as after the fix I lost the bootloader and thus access to everything. One dead netbook.
Well not entirely dead as the data obviously still there on each partitions. So that using Ubuntu from a Live CD and further use of TestDisk could probably get everything back and adjust the start and finish of each partition. But seemed all too hard. So I just adjusted the partitions on the hard disk, created a partition for FreeDOS and installed FreeDOS then installed the most recent stable version of Ubuntu, which created a new bootloader menu for both FreeDOS and Ubuntu. So my netbook can now run either FreeDOS or Ubuntu.
Though the partitions are still not right. FreeDOS complains about faulty partition starting at 1 MByte, but when using GParted such no longer shows up: though it did when I created the partition. For some reason it had 1 Mbyte of free space before the partition. I simply accepted this. As another thing I discovered is that there should be unallocated space between a primary partition and a extended/logical partition: I didn't do this at the beginning. I did do this when I created new partitions. I don't remember doing such several years back when I set up my desktop for Windows XP, MS DOS and Linux.
Part one of objective achieved the netbook boots into FreeDOS fast. Only problem now is getting data to and from the netbook. It doesn't have any CD Drive, nor floppy disks, only usb: and DOS doesn't recognise USB drives without additional software. Problem is how to get that additional software onto the FreeDOS drive if it doesn't recognise the usb flashdrive. For installation can boot to Unbuntu, it recognises the usb drive and the FreeDOS drive, and can therefore copy files across. For general operations however booting to Ubuntu for copying files not practical when objective is a fast booting device. So hopefully can get the USB drivers to work in FreeDOS. If can then that would be good.
Already copied Turbo C and "As Easy As" over to FreeDOS drive. So far only tested that they open. As Easy As is a Lotus 123 like spreadsheet: a relatively small program and cost considerably less than Lotus, but was mostly compatible with: so something to crunch numbers with.
Saturday, December 14, 2013
Exporting Blogger Posts to individual html files
A few months back I exported my blogger blog, producing an atom xml file. I looked
at this in XML notepad 2007 and it didn't seem very helpful. I also opened in MS
Excel, from there at least I was able to extract a list of titles and keywords,
but otherwise a bit messy. I had been experimenting writing own parser for my own
simple xml files, the atom xml however seemed too complicated especially the element
which contains the html formatted post.
I looked around for off-line editors, but none of the ones I could find seemed to be worthy of the title editor, as they are mostly for creation and posting of new posts, rather than editing and managing existing. What I wanted was to extract the individual posts and edit and possibly update the original posts or post again as a new post: noting that this blog is catharsis and basic brain dump of ideas.
Any case more recently I have been experimenting with the MSXML COM automation object, this I used in my simple barrier program to provide the data for the drop down list and associated load tables. So having had some success programming MSXML in both MS Excel/vba and then translating to vb.net, I thought I would take a look at ripping the blogger atom xml file apart with MSXML. {yeh! I'm now aware that I probably shouldn't use MSXML in vb.net}
Which turned out not to be all that complicated in the first instance. The xml file contains a lot of elements called <entry>, not all of these are posts. From looking at the file with XML notepad as far as I could tell those posts which have element <type> with value "html" are the posts and pages of the blog. The following code extracts the appropriate nodes.
Admittedly working out how to select the appropriate nodes wasn't so simple. Currently having problems understanding what I actually grab from the xml data, and what the text property is going to return, or value property returns.
Having got these nodes the next step was to find the child nodes with the required data and then write to either a plain text file or html file. For the initial test I just grabbed the data and wrote to a plain text file. Before writing the program I also copy/pasted the content node data using XML notepad and pasted to notepad and saved as simple text, renamed and viewed in google chrome. The whole xml file can also be viewed in Google chrome: writing a chrome application may be a alternative possibility for extracting the blog posts, but creating local files with a browser is slightly problematic
.
Once confirmed that could grab the posts, I added a few lines of additional code to create a more completely formatted individual html file. Only I was missing the post titles and getting those was more problematic. Well! initially I had everything for the <entry> element printed in the individual files, or otherwise just grabbed the content. So more research on XPath at w3chools.com, and more experimenting with select nodes, to arrive at the search string shown above.
With that search string have to process the child nodes of the node list to get to the <content> and <title> elements. Once I got the titles back into the posts, I figured I had a lot of files and I didn't know what they were as I merely gave them numbers. So I further modified the program to create an index file. So having got all that working on Friday, I figured the next step would be to do something with the categories or keywords assigned to each post. This posed another problem as not every <category> element contains a keyword, nor does it have a value, it only has attributes. Trying to find information on how to access the attributes wasn't easy.
Anycase there are two attributes scheme and term. It seems that "term" contains the keyword if the "scheme" attribute contains "http://www.blogger.com/atom/ns#". Therefore needed to be able to test the value of the attributes and extract the keywords.
Having figured out how to do this, I wrote the keywords to a table in Excel and counted the frequency of use in the blog posts. The code I used is as follows, it will need modifying to use elsewhere, but it my be useful as outline of basic process of getting information from the blogger atom xml. Note that some of the code has wrapped to display into the width of the blog post, and the code needs to be on a single line.
I looked around for off-line editors, but none of the ones I could find seemed to be worthy of the title editor, as they are mostly for creation and posting of new posts, rather than editing and managing existing. What I wanted was to extract the individual posts and edit and possibly update the original posts or post again as a new post: noting that this blog is catharsis and basic brain dump of ideas.
Any case more recently I have been experimenting with the MSXML COM automation object, this I used in my simple barrier program to provide the data for the drop down list and associated load tables. So having had some success programming MSXML in both MS Excel/vba and then translating to vb.net, I thought I would take a look at ripping the blogger atom xml file apart with MSXML. {yeh! I'm now aware that I probably shouldn't use MSXML in vb.net}
Which turned out not to be all that complicated in the first instance. The xml file contains a lot of elements called <entry>, not all of these are posts. From looking at the file with XML notepad as far as I could tell those posts which have element <type> with value "html" are the posts and pages of the blog. The following code extracts the appropriate nodes.
Set nList = xmldoc.selectNodes("//entry[content/@type='html']")
Admittedly working out how to select the appropriate nodes wasn't so simple. Currently having problems understanding what I actually grab from the xml data, and what the text property is going to return, or value property returns.
Having got these nodes the next step was to find the child nodes with the required data and then write to either a plain text file or html file. For the initial test I just grabbed the data and wrote to a plain text file. Before writing the program I also copy/pasted the content node data using XML notepad and pasted to notepad and saved as simple text, renamed and viewed in google chrome. The whole xml file can also be viewed in Google chrome: writing a chrome application may be a alternative possibility for extracting the blog posts, but creating local files with a browser is slightly problematic
.
Once confirmed that could grab the posts, I added a few lines of additional code to create a more completely formatted individual html file. Only I was missing the post titles and getting those was more problematic. Well! initially I had everything for the <entry> element printed in the individual files, or otherwise just grabbed the content. So more research on XPath at w3chools.com, and more experimenting with select nodes, to arrive at the search string shown above.
With that search string have to process the child nodes of the node list to get to the <content> and <title> elements. Once I got the titles back into the posts, I figured I had a lot of files and I didn't know what they were as I merely gave them numbers. So I further modified the program to create an index file. So having got all that working on Friday, I figured the next step would be to do something with the categories or keywords assigned to each post. This posed another problem as not every <category> element contains a keyword, nor does it have a value, it only has attributes. Trying to find information on how to access the attributes wasn't easy.
Anycase there are two attributes scheme and term. It seems that "term" contains the keyword if the "scheme" attribute contains "http://www.blogger.com/atom/ns#". Therefore needed to be able to test the value of the attributes and extract the keywords.
Having figured out how to do this, I wrote the keywords to a table in Excel and counted the frequency of use in the blog posts. The code I used is as follows, it will need modifying to use elsewhere, but it my be useful as outline of basic process of getting information from the blogger atom xml. Note that some of the code has wrapped to display into the width of the blog post, and the code needs to be on a single line.
Sub xmlSimpleList2() Dim wrkbk As Workbook Dim wrkSht As Worksheet Dim WrkRng As Range Dim fpath1 As String Dim keyWordTable As Range Dim keyWord As String Dim xmldoc As MSXML2.DOMDocument Dim xmlNode As MSXML2.IXMLDOMNode Dim tmpNode As MSXML2.IXMLDOMNode Dim nList As MSXML2.IXMLDOMNodeList Dim tmpList As MSXML2.IXMLDOMNodeList Dim oNode As MSXML2.IXMLDOMNode Dim oAttributes As MSXML2.IXMLDOMNamedNodeMap Dim tagName As String Dim tagValue As String Dim i As Integer, j As Integer Dim fp As Integer, fp1 As Integer Set wrkbk = ThisWorkbook Set wrkSht = wrkbk.Worksheets("xmlData") Set WrkRng = wrkSht.Range("A1:A1") Set keyWordTable = ThisWorkbook.Worksheets("keyWords").Range("A1:A1") 'row zero is header Set xmldoc = New MSXML2.DOMDocument xmldoc.async = False If xmldoc.Load(myDocName) Then fp1 = fopen(ThisWorkbook.Path & "\BlogPosts\" & "index.htm", "wt") Print #fp1, "<html>" Print #fp1, "<body>" Print #fp1, "<ol>" 'Test XPath i = 1 j = 1 ' Set nList = xmldoc.selectNodes("//content[@type='html']") Set nList = xmldoc.selectNodes("//entry[content/@type='html']") ' Final text entity is part of the tree, but attributes are not For Each oNode In nList tagName = oNode.nodeName ' Debug.Print i, tagName WrkRng.Offset(i, 0).Value = tagName fpath1 = ThisWorkbook.Path & "\BlogPosts\" & "post" & StrLPadc(CStr(i), 4, "0") & ".htm" fp = fopen(fpath1, "wt") Print #fp, "<html>" Print #fp, "<body>" If oNode.hasChildNodes Then ' Debug.Print "Number of child Nodes: " & oNode.childNodes.Length For Each xmlNode In oNode.childNodes Select Case UCase(xmlNode.nodeName) Case UCase("title") Debug.Print xmlNode.Text WrkRng.Offset(i, 1).Value = xmlNode.Text Print #fp, "<h1>" Print #fp, xmlNode.Text Print #fp, "</h1>" Print #fp1, "<li><a href=" & """" & fpath1 & """" & ">" & xmlNode.Text & "</a></li>" Case UCase("content") Debug.Print "content" Print #fp, xmlNode.Text Case UCase("category") Debug.Print "category" Set oAttributes = xmlNode.Attributes Set tmpNode = oAttributes.getNamedItem("scheme") If tmpNode.Text = bloggerNameSpace Then j = j + 1 Set tmpNode = oAttributes.getNamedItem("term") keyWord = tmpNode.Text WrkRng.Offset(i, j).Value = keyWord Call updateKeyWordList(keyWordTable, keyWord) End If End Select Next xmlNode End If Print #fp, "</body>" Print #fp, "</html>" Close #fp i = i + 1 j = 1 Next oNode Print #fp1, "</ol>" Print #fp1, "</body>" Print #fp1, "</html>" Close #fp1 End If 'xml doc loaded Set xmldoc = Nothing Debug.Print "All Done!" End Sub
Friday, December 06, 2013
Specifications Governing Structural Engineering Software Used by Non-Engineers
There are two documents controlling software for "structural engineering" software to be used by persons who are not structural engineer's these are:
- South Australian Minsters Specification SA A2.2 Structural Engineering Software (2010)
- Australian Building Codes Board (ABCB) : Protocol for Structural Software version 2011.1
Both documents seem to impose a lot of paper shuffling nonsense into the exercise, and seriously miss the point and purpose of much of the software. The software will ultimately be used by customers the end-users of the structures, currently the software is used largely by sales people. To consider training and certifying the customer, the ultimate end-user of the structure being checked is silly. The whole point of the software is to be based on input parameters which are within the comprehension and interests of the end-user, and the outputs of the software are equally to match the end-users interests.
The software has to translate the end-users needs into technical requirements compliant with codes of practice behind the scenes. Code requirements and constraints are not something the end-user needs to deal with nor are they interested in.
The regulatory wants and whims have to be dealt with separately. It is not software that needs to be dealt with, it is repetitively manufactured structural products which need to be properly specified which needs to be dealt with. These structural products can be parametrically varied with in limitations, however I contend it is not acceptable for the specification to be buried within software simply because the software can deal with the variations. A written specification is still required and it will form the basis of the software.
It is really annoying when a manufacturer wants engineering input for a variation beyond the limits of their software, and they have no information what so ever about their product other than a black box computer program they push numbers through. It then becomes necessary to experiment with the black box to see if can gleam any idea of how it makes its assessment, and whether or not agree with it. At least when the suppliers held standard calculations, could look at the calc's and quickly conclude the assessment was inadequate or otherwise acceptable.
As one major problem with structural products is most consultants have no idea how the product can work. So they do calculations and conclude product not acceptable in the first place, so no way they can prove for the variation the manufacturer wants. One part of the problem is that standard products are based on testing, the other part of the problem however is that the original assessment by calculation is just plain incomplete. Now that incomplete assessment is getting hidden away and buried in proprietary software only available to manufacturers and their agents: not available to people who are responsible for granting regulatory approval to go ahead and build.
I don't however believe the solution to the problem involves generating large quantities of paperwork and signatures. The building industry just has not grasped QA versus QC. Quality cannot be inspected in, it has to be designed in. Similarly safety cannot be inspected in, it also has to be designed in. Design of the process doesn't involve creating a system which collects lots of signatures. Also a QA system accredited by a third party, is actually a QC system. If understand QA, then you do not have an accept or reject mentality, therefore getting accreditation or not by some supposed QA authority is contrary to QA philosophy.
Unfortunately the building regulator thought the idea was to get rid of inspections, and opened the door for non-compliance with approved documents. They have now put much of the inspection back, but they still missed the point. QC inspects at the end, and rejects the construction: and thus wastes time and materials. QA makes sure they get it right in the first place, and that requires an entirely different approach.
Quality considered in terms of signal to noise ratio (S/N), the building industry is still focused on boosting the signal rather than filtering out the noise. Hence lots of paperwork generated.
Training people to do the work, is somewhat Procrustean, as it takes the approach of make the person fit the job, rather than design the job to fit the people. The software is meant to be for untrained people, therefore it has to be designed accordingly. So training users, getting them certified, maintaining registers, and keeping certifications up to date, is just plain nonsense. As an interim measure whilst the software is not appropriately designed for the skills of the actual end-users, then training may be necessary. But it shouldn't be a requirement.
Also the requirement that the software be authored by a structural engineer is unacceptable. For certain a structural engineer needs to contribute to the software, but they have far inadequate training to design and develop appropriate user interfaces and error checking systems for software. The structural engineers are partly responsible for the software being rubbish and giving rise to the two controlling documents. The structural engineers may have got the structural calculations behind the scenes right, but the software itself is poor in terms of its user interface's: both the input and the output.
No one seems to be paying all that much attention to the point and purpose of calculations or engineering. Its all reduced to : will you sign off on this, will you provide a certificate. The fundamental basis of our system is adequate evidence-of-suitability, and a mere signature cannot be defended during a coroners inquest.
The two controlling documents provide a good starting point and guidance, but some of the requirements are highly obstructive are going to cause a lot of problems, and are unnecessary.
Wednesday, December 04, 2013
On Developing Structural Analysis 2D Plane Frame Application
Our business doesn't work on debt: taking out loans and hoping will get the business to repay the loan is risky: possibly crazy. Since we had time we invested time: a kind of sweat equity. Whilst hoping for a return on the investment of time, there is no requirement financially, as there is no real debt. Sure economists may throw opportunity costs in the mix and say there is debt. That is it would be considered better to buy the tools and put them to use and start to make money from using the tools rather than expend time creating the tools. The answer to that however is that the only tools required are pencil/paper and a calculator. If can do the work starting with blank piece of paper, then possibly also able to start with a blank computer screen, if can program. Sure the tools develop oneself may not be as good as a bought one. Then again the bought ones may lack certain features. If buy software then constrained to what it does and the way it does it, and also have to wait for authors of the software to update the software to new codes of practice. Then there is a problem of whether the software remains in the market. One consultant had advantage in the cold-formed steel market because he had frame analysis software which designed to AS1538 permissible stress version of cold-formed steel code. Problem was, the company ceased to operate and the software was never updated to AS4600. The consultant had advantage because of what others could do, not because of what he could do.
My philosophy has always been we build those tools ourselves which are practical to build and directly related to what we do: the core activity of engineering design. Not going to waste time building massive complex integrated tools. However with the passage of time the tools which become practical to build in-house increases. It is all dependent on heritage, and building foundations for future development.
So we were only dealing with plane frames. My dad could analyse using moment distribution, I could have learnt such, but speed wise better to use Kleinlogel formula available in steel designers manual {I'm assuming current version has same as earlier versions. Also being mechanical my formal studies didn't go in depth into the analysis of rigid frames.}. So all up we didn't really need frame analysis software, but it would have made things easier and faster.
We had the book: Microcomputer Applications in Structural Engineering by W.H Mosley and W.J Spencer. This book contained several programs written in Basic. I had typed them all into the computer, whilst I was still studying. My dad took the plane frame program and translated into Turbo Pascal, and turned from a cumbersome command line program to one with a graphical interface. Whilst I was experimenting with Turbo C and menu systems, my dad experimented with Turbo Pascal. I opted for C as a programming language, as it was apparently to be the future for AutoCAD. My dad opted for Pascal because it was the language being used on the graduate diploma in computer science he studied. I did learn Pascal as, Turbo Pascal was the first compiler we got for the CPM/80 machine. It wasn't until a few years later when got an MS DOS machine that I got Turbo C.
At this point not releasing the program, as it has our business details hard coded into the reports. It is also proving difficult to recompile a MS DOS program in the windows command prompt as having memory problems. Something to do with the command prompt environment I'm guessing. Also the program doesn't run on my Windows 7 computer: though very little does as its 64 bit: its good at collecting dust. A few years back my dad did convert into vba to run in Excel, and about 2 years back I wrapped it into a vba class. But still looking to get it back into a stand alone application, possibly even a COM automation object, or what ever the equivalent for .net is. Unfortunately the benefits of adopting vb.net to take advantage of all the Excel/vba code I have written are not that apparent: as vb.net has some major differences compared to vba. Therefore looking at going back to Pascal, at the moment managed to rip out all the Turbo gadget graphics and create a console application using Borland Delphi. Given its no longer Borland product, considering adopting Lazarus and free Pascal. The problem I have with that approach is having to revise all my Delphi wind loading procedures from AS1170.2:1989 to AS1170.2:2011, or otherwise translate Excel/vba into Pascal. So may look at parallel developments to integrate everything together.
My current Excel/vba workbooks are using Kleinlogel formula in the worksheets and therefore restricted in the frame they can quickly assess. To change the frame more work required in the worksheet, and that makes it cumbersome to change from one frame to another. Having the frame analysis in vba behind the scenes still doesn't really improve the situation. It is currently being used for carport/canopy design in that manner for one carport supplier: that however has limited capabilities and a small amount of my code in it. Another workbook I have set up using more code and dialogue boxes keeps hitting Excel/vba memory limits. Therefore need to get the code out of Excel/vba. Also having worksheet formula creating a 20Mbyte Excel workbook and needing MS Excel to use that workbook, so as to do what a stand alone 250Kbyte program can do, is really inefficient use of computing resources. The industry keeps running around seeking spreadsheets, because they think that is the simple approach: but then they want greater flexibility in design options than is practical to implement by spreadsheet, and which is also kept within the capabilities of any salesperson.
Spreadsheets and in worksheet formulae are practical for all the dimension and load calculation's prior to using frame analysis software. Spreadsheets and worksheet formulae also practical for design members and connections after frame analysis. But frame analysis in the worksheet formulae is only practical for simple structures: like beams and very simple frames.
That's where the bottleneck emerges. Very simple structural analysis and design, can be completed quickly from a few parameters input to a spreadsheet. Increase the complexity and the integration is loss. Very little frame analysis software has facility to automatically generate the model: a full model that is. Most frame analysis software can generate dimension and geometry for some common structural forms. But the software doesn't calculate and assign the loads to the structural elements. The commercial frame analysis software can also check/design the members once the analysis is complete: depending on materials. Cold-formed steel is not a material commonly available as a design module with commercial software. Therefore have to check members independently, this posing another delay. Then there is the design of connections which also has to be external to the analysis software. The use of BIM can maybe streamline this process for custom buildings, but BIM is typically does not provide parametric modelling of common structural forms.
Just as Toyota aimed for single minute exchange of dies, to improve manufacturing productivity: design and engineering suppliers need also to be looking at single minute design, assessment and documentation, and for that matter even approval. That is, concept to approval in one minute. Not for all structures and buildings, just those which have common structural forms, and are extremely routine. Unfortunately the nail plated timber roof industry use of software through a spanner in the works. It is therefore necessary to avoid those problems, and that requires software which is not proprietary and locked to manufacturers of structures: at least some version of the software needs to available to the whole supply chain: which includes the certifying authorities. Any case I will ramble on more, about that at a later date.
For now here are some screen shots of the application I am breaking apart and converting over to windows.
Sample Data File viewed in UEStudio |
Opening Screen |
Main Menu |
Open Data File |
Analysis |
Screen Plot Menu |
Geometry |
Design Actions |
Action-Effect: Bending Moment |
Action-Effect: Shear |
Action-Effect: Axial Force |
Action-Effect: Exaggerated Deflections |
Any case the plane frame application did allow creating and editing data files, even had facility to print the screen plots to the printer: though locked to a specific printer. The data input screens are as follows.
Main Input Menu |
Main Menu to define structure |
Node Data |
Member Connectivity |
Supports |
Materials |
Sections |
Main Menu for Loads |
Joint Loads |
Member Loads |
Gravity Loads |
Job Details |
Control Data |
Our Pascal version of the program however has dynamically allocated variables, and makes use of record structures and pointers. I think it also makes use of sparse matrices as well. It therefore should not be necessary to input the control data, as it should be able to work it out. Such data should thus also not be required in the data file. So rewriting the file input routines is another part of the current exercise, otherwise creating a new file format, possibly using XML, and a file translator for the older files.
So at the moment looks like parallel developments in Pascal, vb.net and Excel/vba, with possible experimenting with Java. When reach the point of having either a DLL or COM automation library, then should all converge and move over to a single programming environment. Each programming language has its own unique library of built-in functions which become an obstacle when move over to an another language and such functions are not available. It represents more programming before can move forward. Basically each programming language has a different heritage, and therefore different foundations on which to build.
So attempting to bring a collection of tools, developed on as needs basis, together as an integrated whole. Which they were a lot closer to being at the very beginning when we started, but for various reasons they diverged.
Sample Output:
Results File: Showing Definition of Structure |
Results File: More definition of Structure |
Results File: Applied Loads and Calculated Member Forces |
Results File: Support Reactions |
Results File: Moments in Span of Each Member part 1 |
Results File: Moments in Span of Each Member part 2 |
Related Posts:
Download Page for The Plane Frame Analysis Application
Tuesday, December 03, 2013
schTechLIB contents
A rough listing of Functions and Subroutines contained in the schTechLIB. The modules were all extracted using Excel vba CodeCleaner by AppsPro. Then FileLocator Pro regular expressions were used to find the functions and subroutines and report. Not all the parameters are listed as some function/subroutine headers span multiple lines, also some data was lost when the reports were imported into MS Excel and sorted. But its a start at documenting the content.
Revised: Slightly improved by bringing data into MS Access, sorting, creating a grouped report then exporting to html. Unfortunately it exported to multiple pages, when I combined all the html file's it got slightly scrambled. I otherwise formatted some of the cells using Visual Studio 2005. {Yeh! I know, I ain't up to date with any software.}
Buildings |
Building000.bas |
Function |
IsCanopyStructure(StructuralForm As Integer) As Boolean |
IsEnclosedBuildingStructure(StructuralForm As Integer) As Boolean |
IsRoof(BuildingSurface As Integer) As Boolean |
IsWall(BuildingSurface As Integer) As Boolean |
IsWindWard(BuildingSurface As Integer, theta As Double) As Boolean |
SurfaceStr(Surface As Integer) As String |
Building001.bas |
Function |
IsAttachedCanopy(StructType As String) As Boolean |
IsCanopy(StructType As String) As Boolean |
IsDomestic(StructClass As String) As Boolean |
IsGable(RoofType As String) As Boolean |
IsHipped(RoofType As String) As Boolean |
IsIndustrial(StructClass As String) As Boolean |
IsRural(StructClass As String) As Boolean |
IsShed(StructType As String) As Boolean |
IsSkillion(RoofType As String) As Boolean |
IsTroughed(RoofType As String) As Boolean |
Design Actions |
LimitStateConstants.bas |
Sub |
SetLimitStateTables() |
LoadActions001.bas |
Function |
CalcLiveLoad(a As Double) As Double |
MagnifyLoad(a As Double, k1 As Double, k2 As Double, k3 As Double, k4 As Double) As Double |
StructuralLoading001.bas |
Function |
DistributedLoad(AreaLoad As Double, loadwidth As Double) As Double |
TotalLoad(AreaLoad As Double, _ |
StructureLoads.bas |
Sub |
TStructureLoads_Init(xLoad As TStructureLoads) |
Files |
fmFileMngt.bas |
Function |
FileExists(SearchSpec As String) As Boolean |
FirstFileFound(SearchSpec As String, fattr As Integer, foundname As String) As Boolean |
NextFileFound(foundname As String) As Boolean |
fmOpenFilesTEXT.bas |
Function |
fopen(fname As String, fmode As String) As Integer |
Sub |
fopenTXT(fp As Integer, fname As String, fmode As String) |
Geometry |
Geom3D03.bas |
Sub |
SetCoord(pt As TCoord, x1 As Double, y1 As Double, z1 As Double) |
WriteCoord(fp As Integer, pt As TCoord) |
Geom3D05.bas |
Sub |
SetDescr(node As TNode, descr1 As String) |
SetNode(node As TNode, descr1 As String, x1 As Double, y1 As Double, |
WriteNODE(fp As Integer, node As TNode) |
Geom3D06.bas |
Sub |
SetEdge(n1x As Integer, n2x As Integer) |
WriteEdge(fp As Integer) |
Mathematics |
xMathsAreaProperty.bas |
Function |
CircleArea(d As Double) As Double |
RectangleArea(b As Double, h As Double) As Double |
TriangleArea(b As Double, h As Double) As Double |
xMathsExponentials.bas |
Function |
Log10(x As Double) As Double |
LogN(x As Double, n As Double) As Double |
Power(a As Double, x As Double) As Double |
xMathsInterpolation.bas |
Function |
Calc_X(x1 As Double, y1 As Double, x2 As Double, y2 As Double, y As Double) As Double |
Calc_Y(x1 As Double, y1 As Double, x2 As Double, y2 As Double, x As Double) As Double |
Slope_M(x1 As Double, y1 As Double, x2 As Double, y2 As Double) As Double |
YIntercept_C(x1 As Double, y1 As Double, x2 As Double, y2 As Double) As Double |
xMathsNumbers.bas |
Function |
Ceil(x As Double) As Double |
Floor(x As Double) As Double |
Frac(x As Double) As Double |
MaxValue(Recrds() As Double) |
MinValue(Recrds() As Double) |
Sub |
dec(ByRef i As Integer) |
inc(ByRef i As Integer) |
MathTest1() |
xMathsRightTriangle.bas |
Function |
Polar_Angle(x As Double, y As Double) As Double |
Polar_Radius(x As Double, y As Double) As Double |
RectCoord_x(r As Double, theta As Double) As Double |
RectCoord_y(r As Double, theta As Double) As Double |
RightTrig_Adj(Hyp_r As Double, Opp_y As Double) As Double |
RightTrig_Cos(Hyp_r As Double, Adj_x As Double) As Double |
RightTrig_Hyp(Adj_x As Double, Opp_y As Double) As Double |
RightTrig_Opp(Hyp_r As Double, Adj_x As Double) As Double |
RightTrig_Rise(Adj_x_Run As Double, theta As Double) As Double |
RightTrig_Run(Opp_y_Rise As Double, theta As Double) As Double |
RightTrig_Sin(Hyp_r As Double, Opp_y As Double) As Double |
RightTrig_Tan(Adj_x As Double, Opp_y As Double) As Double |
xMathsSortingSubs.bas |
Sub |
Sort(Recrds() As Double, Index() As Integer, n As Integer) |
SwapDouble(Arg1 As Double, Arg2 As Double) |
SwapInt(Arg1 As Integer, Arg2 As Integer) |
xMathsTrigonometry.bas |
Function |
ArcCos(x As Double) As Double |
ArcSin(x As Double) As Double |
From_HMS(h As Double, m As Double, s As Double) As Double |
From_HMS2(theta As Double) As Double |
get1stQuadAngle(theta As Double) As Double |
getRationalAngle(theta As Double) As Double |
pi() As Double |
To_HMS(theta As Double) As String |
To_HMS2(theta As Double) As String |
ToDegrees(x As Double) As Double |
ToRadians(x As Double) As Double |
Mechanics |
BeamBM.bas |
Function |
BeamBM1(BM1 As Double, r1 As Double, w As Double, x As Double) |
BeamCantilevers.bas |
Function |
BM_Cant1(w As Double, x As Double, L As Double) As Double |
BeamFF1.bas |
Function |
BM_FF1(w As Double, x As Double, L As Double) As Double |
def_FF1(w As Double, x As Double, L As Double, EI As Double) As Double |
defMax_FF1(w As Double, L As Double, EI As Double) As Double |
FEM_FF1(w As Double, L As Double) As Double |
Ra_FF1(w As Double, L As Double) As Double |
Rb_FF1(w As Double, L As Double) As Double |
BeamFF2.bas |
Function |
BM_FF2(w As Double, x As Double, a As Double, b As Double, L As Double) As Double |
FF2_Ra(w As Double, a As Double, b As Double, L As Double) As Double |
FF2_Rb(w As Double, a As Double, b As Double, L As Double) As Double |
Sub |
TestFF2() |
BeamOverHang.bas |
Function |
BM_Ohang(P As Double, x As Double, a As Double, b As Double) As Double |
def_Ohang(P As Double, x1 As Double, a As Double, b As Double, EI As Double) As Double |
BeamSS.bas |
Function |
eq_udl1(n As Integer, w() As Double, a() As Double, _ |
SS_Beam_BM(w As Double, L As Double, _ |
SS_Beam_BM2(w As Double, L As Double, _ |
SS_Beam_RA(w As Double, L As Double, _ |
SS_Beam_RA2(w As Double, L As Double, _ |
SS_Beam_RB(w As Double, L As Double, _ |
Sub |
Beam3() |
BeamSS1.bas |
Function |
BM_ss1(w As Double, x As Double, L As Double) As Double |
def_ss1(w As Double, x As Double, L As Double, EI As Double) As Double |
defMax_SS1(w As Double, L As Double, EI As Double) As Double |
Ra_SS1(w As Double, L As Double) As Double |
udl_ss1(BM As Double, L As Double) As Double |
BeamSS2.bas |
Function |
BM_ss2(w As Double, x As Double, a As Double, b As Double, L As Double) As Double |
BM_ss2c(w As Double, x As Double, a As Double, b As Double, c As Double) As Double |
defMax_ss2(w As Double, _ |
R_ss2(w As Double, a As Double, b As Double, L As Double, ReactionNode As String) As Double |
Sub |
ss2(w As Double, a As Double, b As Double, L As Double, _ |
ss2c(w As Double, a As Double, b As Double, c As Double, _ |
BeamSS3.bas |
Function |
BM_ss3(w As Double, x As Double, L As Double, a As Double) As Double |
def_ss3(w As Double, x As Double, a As Double, L As Double, EI As Double) As Double |
Ra_SS3(w As Double, L As Double, a As Double) As Double |
Rb_SS3(w As Double, L As Double, a As Double) As Double |
Sub |
ss3(w As Double, L As Double, a As Double, _ |
BeamSS9.bas |
Function |
BM_ss9(P As Double, x As Double, a As Double, L As Double) As Double |
def_ss9(P As Double, x As Double, a As Double, L As Double, EI As Double) As Double |
R_ss9(P As Double, a As Double, b As Double, L As Double, ReactionNode As String) As Double |
BoltProp.bas |
Function |
AS4100_BoltShear(fuf As Double, kr As Double, _ |
AS4100_BoltTension(fuf As Double, A_s As Double) As Double |
AS4100_BoltTension2(d As Double, P As Double, fuf As Double) As Double |
MeanDiam(d As Double, P As Double) As Double |
MeanDiam2(d As Double, P As Double) As Double |
MinorDiam(d As Double, P As Double) As Double |
PitchDiam(d As Double, P As Double) As Double |
TensileArea(d As Double, P As Double) As Double |
ENVMySystem.bas |
Sub |
SetMachine(ByRef fpathMtrl As String) |
Mechanics1.bas |
Function |
getMomentCapacity(f As Double, z As Double) As Double |
getRequiredSectionModulus(f As Double, BM As Double) As Double |
RadiusGyration(i As Double, Area As Double) |
SimpleStress(Force As Double, Area As Double) As Double |
MechDesign010.bas |
Function |
DesignResistance(phi As Double, Kmod As Double, fo As Double, GeomSectProp As Double) As Double |
FlexuralResistance(phi As Double, Kmod As Double, fy As Double, Ze As Double) As Double |
KResultant(k() As Double) As Double |
TensileResistance(phi As Double, Kmod As Double, fy As Double, Area As Double) As Double |
Sub |
TestMechDesign1() |
MechDesign090.bas |
Function |
getFx(f As Double, theta As Double) As Double |
getFy(f As Double, theta As Double) As Double |
Resolve_Fx(Axial As Double, Shear As Double, beta As Double) As Double |
Resolve_Fy(Axial As Double, Shear As Double, beta As Double) As Double |
ProppedCantilevers.bas |
Function |
BM_PC1(w As Double, x As Double, L As Double) As Double |
SectionProperties.bas |
Function |
Ixx_plate(b As Double, h As Double) As Double |
Steel |
SteelSection5.bas |
Function |
AS4100_get_bfo(Tf As Double, fy As Double) As Double |
AS4100_get_Zc(z As Double, s As Double) As Double |
AS4100_get_Ze(z As Double, s As Double, _ |
AS4100_get_Zn(z As Double, s As Double, lambda_s As Double, _ |
AS4100_get_Zs(z As Double, s As Double, _ |
AS4100_getAlpha_d(dp As Double, fy As Double, s As Double, _ |
AS4100_getAlpha_f(bfo As Double, Tf As Double, tw As Double, d1 As Double) As Double |
AS4100_getAlpha_m(Mmax As Double, m2 As Double, M3 As Double, M4 As Double) As Double |
AS4100_getAlpha_s(Ms As Double, Moa As Double) As Double |
AS4100_getAlpha_v(tw As Double, dp As Double, fy As Double, s As Double, _ |
AS4100_getLambda_e(b As Double, t As Double, fy As Double, isCHS As Boolean) As Double |
AS4100_getLambda_s(lambda_e1 As Double, lambda_e2 As Double, ByRef elem As Integer) As Double |
AS4100_getLe(kt As Double, kl As Double, kr As Double, L As Double) As Double |
AS4100_getMo(E As Double, G As Double, Iy As Double, J As Double, _ |
AS4100_getMs(fy As Double, Ze As Double) As Double |
AS4100_getphiMb(phi As Double, alpha_m As Double, alpha_s As Double, Ms As Double) As Double |
AS4100_getphiMs(phi As Double, fy As Double, Ze As Double) As Double |
AS4100_getphiVv(phi As Double, Vv As Double) As Double |
AS4100_getUnSymMo(E As Double, G As Double, Iy As Double, J As Double, _ |
AS4100_getVvm(Vv As Double, m As Double, phiMb As Double) As Double |
SteelCFAllSections.bas |
Function |
get_Ae_AS4600(d As Double, Bf As Double, t As Double, _ |
get_Zex_AS4600(d As Double, Bf As Double, t As Double, _ |
SteelCFBoxSectionProp.bas |
Function |
get_BOX_Ae(d As Double, Bf As Double, t As Double, _ |
get_BOX_J(a As Double, b As Double, t1 As Double, t2 As Double) As Double |
get_BOX_Zex(d As Double, Bf As Double, t As Double, _ |
Sub |
BOX_checkWeb(d As Double, d1 As Double, ri As Double, t As Double, _ |
BOX_CompressionFlange(Bf As Double, ri As Double, t As Double, _ |
BOX_CornerFillet(d As Double, ri As Double, t As Double) |
BOX_FullyEffective_Web(d As Double, ri As Double, t As Double, d1 As |
BOX_TensionFlange(Bf As Double, d As Double, ri As Double, t As Doub |
BOX_test() |
BOXSection_Prop(d As Double, Bf As Double, t As Double, _ |
Calc_BOX_Zex(ns As Integer, t As Double, ycg As Double, Ixx As Doubl |
SteelCFCSectionProp.bas |
Function |
get_Ae(d As Double, Bf As Double, t As Double, _ |
get_Zex(d As Double, Bf As Double, t As Double, _ |
Sub |
AS4100_getVw(fy As Double, Ae As Double, isCHS As Boolean) As Double |
AS4100_HasFullLateralRestraint(L As Double, Beta_m As Double, _ |
GetSlenderElement(lambda_e1 As Double, lambda_e2 As Double) As Integer |
IsCompact(lambda_s As Double, lambda_sp As Double) As Boolean |
IsNonCompact(lambda_s As Double, lambda_sp As Double, lambda_sy) As Boolean |
IsSlender(lambda_s As Double, lambda_sy) As Boolean |
IsTransverseStiffenedWebOk(t As Double, s As Double, d1 As Double, fy As Double) As Boolean |
IsUnstiffenedWebOk(t As Double, d1 As Double, fy As Double) As Boolean |
SteelSection6.bas |
Function |
AS4100_get_be(b As Double, lambda_ey As Double, lambda_e As Double, ElementType As Integer) As Double |
AS4100_get_kf(Ae As Double, Ag As Double) As Double |
AS4100_get_lambda_e(b As Double, t As Double, fy As Double, ElementType As Integer) As Double |
AS4100_get_Le(ke As Double, L As Double) As Double |
AS4100_get_Nc(alpha_c As Double, ns As Double) |
AS4100_get_Ns(kf As Double, An As Double, fy As Double) |
SteelSection633.bas |
Function |
AS4100_get_Alpha_a(lambda_n As Double) As Double |
AS4100_get_Alpha_c(xi As Double, lambda As Double) As Double |
AS4100_get_eta(lambda As Double) As Double |
AS4100_get_lambda(lambda_n As Double, alpha_a As Double, alpha_b As Double) As Double |
AS4100_get_lambda_n(le As Double, r As Double, kf As Double, fy As Double) As Double |
AS4100_get_xi(lambda As Double, eta As Double) As Double |
SteelSection7AxialTension.bas |
Function |
AS4100_getNt(Ag As Double, An As Double, _ |
SteelStructSections.bas |
Function |
ElementEffectiveWidth(SectionType As Integer, b As Double, _ |
getElasticityLimit(PlateElementType As Integer, _ |
getNumberOfEdgesSupported(SectElement As Integer, _ |
getPlasticityLimit(PlateElementType As Integer, _ |
getPlateElementType(SectionType As Integer) As Integer |
getSectionDescrCode(code As Integer) As String |
getSectionType(section As String) |
getStressGradientState(SectElement As Integer, SectionType As Integer, axis As String) As Integer |
isSectionCHS(section As String) As Boolean |
isSectionRHS(section As String) As Boolean |
isSectionSHS(section As String) As Boolean |
isSectionUB(section As String) As Boolean |
isSectionUC(section As String) As Boolean |
Sub |
LoadSectionCodes() |
Strings |
xstring.bas |
Function |
FmtAcadPath(fPath As String) As String |
fnDir(fPath As String) As String |
fnDrv(fPath As String) As String |
fnExt(fPath As String) As String |
fnmerge(fPath As String, drv As String, fdir As String, fname As String, fext As String) As String |
fnName(fPath As String) As String |
fnName2(fPath As String) As String |
strchr(s As String, c As String) As Integer |
StrLen(s As String) As Integer |
StrLPad(s As String, lStr As Integer) As String |
StrLPadc(s As String, lStr As Integer, c As String) As String |
strlwr(s As String) As String |
StrNset(s As String, ch As String, n As Integer) As String |
StrRChr(s As String, c As String) As Integer |
StrRPad(s As String, lStr As Integer) As String |
StrRPadc(s As String, lStr As Integer, c As String) As String |
strupr(s As String) As String |
substr(s As String, sp As Integer, L As Integer) As String |
Sub |
fnsplit(fPath As String, drv As String, fdir As String, fname As Str |
fnsplit2(fPath As String, drv As String, fdir As String, fname As St |
xStrLib.bas |
Function |
isAlnum(ch As String) As Boolean |
isAlpha(ch As String) As Boolean |
isCntrl(ch As String) As Boolean |
isDigit(ch As String) As Boolean |
isLower(ch As String) As Boolean |
isPrint(ch As String) As Boolean |
isPunct(ch As String) As Boolean |
isSpace(ch As String) As Boolean |
isUpper(ch As String) As Boolean |
xStrLib2.bas |
Function |
isNumber(s As String) As Boolean |
Structure |
Structure11.bas |
Sub |
ConnectMtrlDB(ByRef dbs As Database, ByRef tbl As Recordset) |
DisplayMaterial(m As TStructMATERIAL) |
DisplaySectProp(s As String) |
DisplaySectProp2(m As TStructMEMBER) |
getSectProp(tbl As Recordset, ByRef m As TStructMEMBER, s As String) |
MyTest() |
Timber |
TimberDesign001.bas |
Function |
Get_G_41(lb As Double, Sc As Double, Eb As Double, Ec As Double, Ib As Double, Ic As Double) As Double |
Get_G_42(lb As Double, Sc As Double, Eb As Double, Ec As Double, Ib As Double, Ic As Double) As Double |
Get_G_43(lb As Double, Sc As Double, Eb As Double, Ec As Double, Ib As Double, Ic As Double) As Double |
Flex_Capacity(fb As Double, Zx As Double) As Double |
Get_Axial_FLR(db As Double) As Double |
Get_Axial_k12(beff As Double, bact As Double, length As Double, Leff As Double, g13 As Double, rhoc As Double) As Double |
Get_Flex_FLR(db As Double, bb As Double, rhob As Double) As Double |
Get_Flex_k12(db As Double, bb As Double, Lay As Double, rhob As Double, resflng As String) As Double |
Get_Iy_comp(Iy As Double, Aspar As Double, hz As Double) As Double |
Get_k11(db As Double) As Double |
Get_SpacedColumn_k12(g13 As Double, g28 As Double, Ac As Double, Ic As Double, Lc As Double, rhoc As Double) As Double |
S1_Compression(db As Double, bb As Double, Lay As Double) As Double |
S1_Continuous(db As Double, bb As Double, Lay As Double, resflng As String) As Double |
S1_Tension(db As Double, bb As Double, Lay As Double) As Double |
S1_TorsRest(db As Double, bb As Double, Lar As Double) As Double |
5_SpacedColumn(g13 As Double, g28 As Double, Ac As Double, Ic As Double, Lc As Double) As Double |
Strut_Capacity(fc As Double, ax As Double) As Double |
Tie_Capacity(ft As Double, At As Double) As Double |
TimberDesign002.bas |
Function |
Slenderness_S1(d As Double, b As Double, La As Double, _ |
Slenderness_S2(d As Double, b As Double, Lay As Double, DesignCase As Integer) As Double |
Slenderness_S3(d As Double, _ |
Slenderness_S4(d As Double, b As Double, _ |
Stability_k12(rho_b As Double, s1 As Double) As Double |
Stability_k12C(rho_c As Double, s As Double) As Double |
Timber_Bearing(phi As Double, k1 As Double, k4 As Double, k6 As Double, _ |
Timber_k11(d As Double, DesignCase As Integer, V As Double) As Double |
Timber_phiM(phi As Double, k1 As Double, _ |
Timber_phiNc(phi As Double, k1 As Double, k4 As Double, k6 As Double, _ |
Timber_phiNt(phi As Double, k1 As Double, k4 As Double, k6 As Double, _ |
Timber_phiV(phi As Double, k1 As Double, k4 As Double, k6 As Double, _ |
Timber_rho_b(E As Double, fb As Double, r As Double, _ |
Timber_rho_c(E As Double, fc As Double, r As Double, _ |
TimberDesign003.bas |
Function |
NailedJoint_phiMj(phi As Double, k1 As Double, k13 As Double, _ |
NailedJoint_phiNj(phi As Double, k1 As Double, k13 As Double, _ |
NailedJoint_phiNjaxial(phi As Double, k13 As Double, _ |
TimberDesign004.bas |
Function |
ScrewedJoint_phiNj(phi As Double, k1 As Double, k13 As Double, _ |
ScrewedJoint_phiNjaxial(phi As Double, k13 As Double, _ |
TimberDesign005.bas |
Function |
BoltedJoint_phiNj(phi As Double, k1 As Double, _ |
BoltedJoint_phiNjaxial(phi As Double, _ |
get_Qkl(fcj As Double, t As Double, d As Double, JointGroup As String) As Double |
get_Qkp(fpj As Double, t As Double, d As Double, JointGroup As String) As Double |
Hankinson_Qsk(Qskl As Double, Qskp As Double, theta As Double) As Double |
Timber_beff(t1 As Double, t2 As Double, DesignCase As Integer) As Double |
TimberDesign006.bas |
Function |
Timber_k17(Nrows As Double, isSeasoned As Boolean) As Double |
Timber_k17Bolts(Nrows As Double, isSeasoned As Boolean, _ |
Wind Actions |
Fabric1.bas |
Function |
eqLCp(k As Double, Cpe As Double, Cpi As Double, L As Double, b As Double, _ |
LoadActionsWind001.bas |
Function |
FindHght(HghtTbl As Variant, MinHght As Double, MaxHght As Double, hght As Double) As Integer |
FindTC(TCat As Double) As Integer |
get_b(theta As Double, BldSpan As Double, BldLen As Double) As Double |
get_d(theta As Double, BldSpan As Double, BldLen As Double) As Double |
Get_Dist_a(ht As Double, BldSpan As Double, BldLen As Double) As Double |
get_h(theta As Double, alpha As Double, He As Double, ht As Double) As Double |
Get_Ka(Trib_Area As Double) As Double |
get_Qz(V As Double) As Double |
get_Vp(Rgn As String) As Double |
get_Vs(Rgn As String) As Double |
get_Vu(Rgn As String) As Double |
get_Vz(V As Double, Mzcat As Double, Ms As Double, Mt As Double, Mi As Double, Md As Double, state As Integer) As Double |
getDistToLoad(dwe As Double, h As Double) As Double |
getMzcat(ByVal WindRegion As String, ByVal hght As Double, ByVal TCat As Double, ByVal Interpolate As Boolean) As Double |
getPressureLimit(Limit As Integer) As String |
getRgnMzCat(MzcatTbl As Variant, HghtTbl As Variant, MinHght As Double, MaxHght As Double, hght As Double, TCat As Double, Interpolate As Boolean) As Double |
LmtState_ndx(LmtState As String) As Integer |
Region_ndx(Rgn As String) As Integer |
TCatStr(TCat As Double) As String |
TCatVal(TCatStr As String) As Double |
LoadActionsWind002.bas |
Function |
getMaxInSector(dataList As Range, sectorStart As Double, sectorEnd As Double, row_index_num As Integer, alternateValue As Double) As Double |
LoadActionsWindBuilding.bas |
Function |
getBuildingCpe(theta As Double, alpha As Double, He As Double, ht As Double, _ |
getBuildingKa(theta As Double, TAreaRafter As Double, TAreaColumn As Double, IsWall As Boolean) As Double |
getRoofCpe(theta1 As Double, alpha As Double, He As Double, ht As Double, _ |
getWallCpe(theta1 As Double, alpha As Double, He As Double, ht As Double, _ |
LoadActionsWindBuilding000.bas |
Function |
Find_HDRatio(h As Double, d As Double, Limit As Integer) As Integer |
FindAlpha(alpha As Double, Limit As Integer) As Integer |
FindAlpha2(alpha As Double) As Integer |
Get_Cpe_D(theta As Double, alpha As Double, He As Double, _ |
Get_Cpe_L(theta As Double, alpha As Double, He As Double, ht As Double, BldSpan As Double, BldLen As Double) As Double |
Get_Cpe_S(theta As Double, alpha As Double, He As Double, ht As Double, dwe As Double) As Double |
Get_Cpe_U(theta1 As Double, alpha As Double, He As Double, ht As Double, _ |
Get_Cpe_UD(theta As Double, alpha As Double, He As Double, ht As Double, _ |
Get_Cpe_W(h As Double) As Double |
LoadActionsWindBuilding1.bas |
Function |
BuildingCpeRoof(theta As Double, alpha As Double, _ |
LoadActionsWindCanopies000.bas |
Function |
CanopyCp(theta As Double, alpha As Double, h As Double, d As Double, _ |
LoadActionsWindCanopies001.bas |
Function |
get_Cpl(theta As Double, alpha As Double, h As Double, d As Double, _ |
get_Cpn3(theta As Double, alpha As Double, h As Double, d As Double, _ |
get_Cpw(theta As Double, alpha As Double, h As Double, d As Double, _ |
getCanopy_Cpn(theta As Double, alpha As Double, h As Double, d As Double, _ |
LoadActionsWindCanopies002.bas |
Function |
get_Cpn(theta As Double, h As Double, hc As Double, wc As Double, Limit As Integer) As Double |
get_Cpn1(theta As Double, h As Double, hc As Double, wc As Double, Limit As Integer) As Double |
get_Cpn2(theta As Double, h As Double, hc As Double, wc As Double, Limit As Integer) As Double |
LoadActionsWindCanopies003.bas |
Function |
get_Cpl2(theta As Double, alpha As Double, h As Double, d As Double, state As Integer, Limit As Integer) As Double |
get_Cpw2(theta As Double, alpha As Double, h As Double, d As Double, state As Integer, Limit As Integer) As Double |
getPitchedCanopy_Cp(theta As Double, alpha As Double, h As Double, d As Double, _ |
LoadActionsWindDistributedLoads.bas |
Sub |
DisplayUDLtable(ndx() As Integer, dwe() As Double, Cp() As Double, a |
InitialiseUDL(ndx() As Integer, w() As Double, a() As Double, b() As |
SetDwe(He As Double, halfwdth As Double, BldSpan As Double, dwe() As |
LoadActionsWindDistribution2.bas |
Sub |
SteppedLoadst0(alpha As Double, He As Double, _ |
Calc_Zex(ns As Integer, t As Double, ycg As Double, Ixx As Double, Z |
checkWeb(d As Double, d1 As Double, ri As Double, t As Double, _ |
CompressionFlange(Bf As Double, ri As Double, t As Double, _ |
CompressionLip(dL As Double, ri As Double, t As Double, _ |
CornerFillet(d As Double, ri As Double, t As Double) |
CSection_Prop(d As Double, Bf As Double, t As Double, _ |
FullyEffective_Web(d As Double, ri As Double, t As Double, d1 As Dou |
ReducedCompressionLip(ri As Double, t As Double, ds As Double) |
TensionFlange(Bf As Double, d As Double, ri As Double, t As Double) |
TensionLip(d As Double, dL As Double, ri As Double, t As Double) |
test() |
SteelCFDesign.bas |
Function |
AS4600_Msxf(SectionName As String, _ |
AS4600_Ne(E As Double, SectionName As String, _ |
AS4600_phiMb(E As Double, G As Double, SectionName As String, _ |
AS4600_phiMs(E As Double, SectionName As String, _ |
AS4600_phiNc(E As Double, G As Double, SectionName As String, _ |
AS4600_phiNs(E As Double, G As Double, SectionName As String, _ |
AS4600_phiNt(SectionName As String, phi As Double, _ |
Sub |
getBuiltUpSectProp(tbl As Recordset, ByRef m As TStructMEMBER, s As |
LoadActionsWindDrag.bas |
Function |
Drag_Cfig(L As Double, b As Double, Kar As Double, _ |
getWind_Kar(L As Double, b As Double) As Double |
LoadActionsWindEquivUDL.bas |
Function |
equivUDL0(alpha As Double, He As Double, _ |
equivUDL0m(alpha As Double, He As Double, _ |
LoadActionsWindEquivWind1.bas |
Function |
EquivUDL90(alpha As Double, He As Double, ht As Double, _ |
getDistToLoad(dwe As Double, h As Double) As Double |
Sub |
EquivUDL90test() |
LoadActionsWindSkillion.bas |
Function |
equivUDL0m2(theta As Double, alpha As Double, He As Double, _ |
LoadActionsWindTable00.bas |
Sub |
SetWindTables00() |
LoadActionsWindTable01.bas |
Sub |
SetWindSpeedTables() |
LoadActionsWindTable02.bas |
Sub |
SetWindDirectionTables() |
LoadActionsWindTable03.bas |
Function |
CalcV_SiteBeta(Vr As Double, Mzcat As Double, Ms As Double, _ |
get_Md(Rgn As String, directn As String) As Double |
get_Vregional(Rgn As String, ReturnPeriod As Double) As Double |
getDirectnIndex(directn As String) As Integer |
getReturnPeriod(LimitState As Integer, ImportanceLevel As Integer) As Double |
getRgnIndex(Rgn As String) As Integer |
getV_theta(theta As Double) |
HlookupG(WrkBk As String, Sht As String, DtaLst As String, _ |
Sub |
set_Md() |
LoadActionsWindTable04.bas |
Sub |
LoadTable2() |
LoadTables1() |
WriteTable2() |
Function |
IsMemberStableEnough() As Boolean |
IsMemberStrongEnough() As Boolean |
IsSectionStableEnough() As Boolean |
IsSectionStrongEnough(N_star As Double, phiNc As Double) As Boolean |
Cold-Formed Steel |
SteelCFDesign3.bas |
Function |
getDesignSection(BM As Double, Lex As Double, Ley As Double, Lez As Double, _ |
SteelCFLippedIBeam.bas |
Function |
get_LippedIBeam_Iw(Iy As Double, a As Double, _ |
SteelCFSect2.bas |
Function |
AS4600_ka(dL As Double, b As Double) As Double |
effectiveWidth(b As Double, rho As Double, chi As Double, _ |
get_be(b As Double, lambda As Double, rho As Double) As Double |
get_C2(I_s As Double, Ia As Double) As Double |
get_ds(dse As Double, C2 As Double) As Double |
get_Ia(b As Double, t As Double, ku As Double, s As Double) As Double |
get_k_EdgeStiffened(b As Double, t As Double, s As Double, ka As Double, C2 As Double) As Double |
get_k_unStiffened(chi As Double) As Double |
get_lambda(k As Double, b As Double, t As Double, f As Double, E As Double) As Double |
get_Rho(lambda As Double) As Double |
get_S(E As Double, f As Double) As Double |
PlateBucklingCoeff_k(b As Double, chi As Double, _ |
Sub |
EdgeStiffenedElement(b As Double, t As Double, dL As Double, _ |
SteelCFSect3.bas |
Function |
get_Fo(E As Double, le As Double, r As Double) As Double |
get_Foz(E As Double, G As Double, J As Double, Iw As Double, Lez As Double, a As Double, r01 As Double) As Double |
get_Le(L As Double, ke As Double) As Double |
get_ro1(rx As Double, ry As Double, xo As Double, yo As Double) As Double |
get_SR(le As Double, k As Double) As Double |
SteelCFSect3AxialCompression.bas |
Function |
Euler_Pcr(c As Double, E As Double, i As Double, L As Double) As Double |
get_Beta(xo As Double, r01 As Double) As Double |
get_fc(Mc As Double, Zx As Double) As Double |
get_fn(lambda_c As Double, fy As Double) As Double |
get_foc(E As Double, le As Double, r As Double) As Double |
get_foc2(foz As Double, fox As Double) As Double |
get_foc3(beta As Double, foz As Double, fox As Double) As Double |
get_lambda_c(fy As Double, foc As Double) As Double |
get_MINfoc(fox As Double, foy As Double, foc3 As Double) As Double |
get_Nc(Ae As Double, fn As Double) As Double |
get_Ns(Ae As Double, fy As Double) As Double |
get_phiNc(E As Double, G As Double, fy As Double, _ |
get_phiNd(phi As Double, ns As Double, nc As Double) As Double |
get_phiNs(E As Double, G As Double, fy As Double, _ |
SteelCFSect3AxialTension.bas |
Function |
get_Nt(Ag As Double, fy As Double, fu As Double, An As Double, kt As Double) As Double |
SteelCFSect3Bending.bas |
Function |
get_Cb(Mmax As Double, M3 As Double, M4 As Double, M5 As Double) As Double |
get_Cm(m1 As Double, m2 As Double) As Double |
get_lambda_b(My As Double, Mo As Double) As Double |
get_Mb(Zc As Double, Mc As Double, Zf As Double) As Double |
get_Mc(lambda_b As Double, My As Double) As Double |
get_Mc_CZ(lambda_b As Double, My As Double) As Double |
get_Mo(cb As Double, a As Double, r01 As Double, foy As Double, foz As Double) As Double |
get_Mo_for_CZ(E As Double, Cm As Double, Iy As Double, Iw As Double, L As Double) As Double |
get_Mo_for_psZs(E As Double, cb As Double, d As Double, Iyc As Double, L As Double) As Double |
get_Mo1(Cs As Double, Cm As Double, a As Double, r01 As Double, Beta_y As Double, fox As Double, foz As Double) As Double |
get_Ms(Ze As Double, fy As Double) As Double |
get_My(Zf As Double, fy As Double) As Double |
get_phiMb(E As Double, G As Double, fy As Double, _ |
get_phiMs(d As Double, Bf As Double, t As Double, _ |
getMb( _ |
SteelCFSect3Combined.bas |
Function |
get_alpha_nx(n As Double, Ne As Double) As Double |
SteelCFSect3Webs.bas |
Function |
getBearing(fy As Double, d1 As Double, tw As Double, ri As Double, _ |
getC2(ri As Double, tw As Double) As Double |
getC4(ri As Double, t As Double) As Double |
getC5(k As Double) As Double |
getC7(d1 As Double, tw As Double) As Double |
getC8(d1 As Double, tw As Double, k As Double) As Double |
getShear(E As Double, fy As Double, d1 As Double, tw As Double, a As Double) As Double |
IsBendingShearOk(m As Double, Mcap As Double, V As Double, Vcap As Double, AsTransverseStiffeners As Boolean) As Boolean |
SteelCFSect5Connections1.bas |
Function |
AS4600_BoltBearing(fy As Double, fu As Double, df As Double, _ |
AS4600_BoltTearOut(fy As Double, fu As Double, _ |
AS4600_NetSectionTension(fy As Double, fu As Double, df As Double, _ |
getEdgeDist(edgeDist As Double, df As Double, isForHoles As Boolean) |
SteelCFSect5Connections2.bas |
Function |
AS4600_NetSectionTensionScrews(fy As Double, fu As Double, df As Double, _ |
AS4600_ScrewTension(fu1 As Double, fu2 As Double, df As Double, dw As Double, _ |
AS4600_ScrewTiltingBearing(fu1 As Double, fu2 As Double, df As Double, _ |
SteelCFUnLippedChannel.bas |
Function |
get_CHANNEL_Zex(d As Double, Bf As Double, t As Double, _ |
Database |
xdbUtility2013.bas |
Function |
MtrlDB() |
Debugging |
DBGCleaner.bas |
Sub |
CleanUP() |
DBGGeneral.bas |
Sub |
DisplayAbout() |
SayNotYet() |
DBGLogger.bas |
Sub |
CloseLogFile() |
SetLogFile(fn As String) |
DBGScreenTracer.bas |
Sub |
TraceFunction(s As String, state As Integer, FuncLevel As Integer, i |
DBGScreenTracer1.bas |
Sub |
TraceFunction(s As String, state As Integer, FuncLevel As Integer, i |
DBGTracer.bas |
Sub |
CloseTraceFile() |
SetMytracer(state As Boolean) |
SetMyTracerOFF() |
SetMyTracerON() |
SetTraceFile() |
DBGTracerWorkBook.bas |
Sub |
IncTracerCol() |
IncTracerCounters() |
IncTracerRow() |
SetTraceWrkBk(TracerNewBook As Boolean) |
WriteCellTracer(r As Integer, c As Integer, V As Variant) |
WritelnTracer(V As Variant) |
WriteVarTracer(s As String, V As Variant) |
WriteVarUnitsTracer(s As String, V As Variant, u As String) |
NB: Some of the functions replicate those which are available in MS Excel but not available in vba. Since I want my vba code portal between MS Excel and MS Access and any other applications I may use, without having to use the Excel Application object to call worksheet functions, I have written the code in vba. I also recently read a few blogs and forum discussions indicating that calling the Excel worksheet functions in vba may be slower than writing a vba routine: depending on what you intend on doing.
Revised: Slightly improved by bringing data into MS Access, sorting, creating a grouped report then exporting to html. Unfortunately it exported to multiple pages, when I combined all the html file's it got slightly scrambled. I otherwise formatted some of the cells using Visual Studio 2005. {Yeh! I know, I ain't up to date with any software.}
Subscribe to:
Posts (Atom)