ArcView cung cấp một phương thức khác cho phép tuỳ biến gọi là extension. Extension cung cấp một cách thức tiện lợi cho phép phân phối tập các công cụ cùng với các thành phần cần thiết khác. Lợi ích của extension là có thể load khi cần các công cụ mở rộng. Trong ArcView có một số extension có sẵn như CAD Reader, Digitizer, Network Analyst, Spatial Analyst. Các extension này thêm mới các button và menu vào giao diện ArcView hay cho phép ArcView hiển thị thêm các dạng format dữ liệu như là CAD.
Nội dung chính
A.FILE
1. MÔ HÌNH LƯỢC ĐỒ ĐỐI TƯỢNG FILE
Lớp File có hai lớp con thuộc về nó, đó là LineFile và TextFile. Mỗi đối tượng File có một tên File tương ứng với nó. FileDialog chứa các FileName.
ODB không phải là một đối tượng của lớp File nó là một dạng File đặc biệt.
2. THAO TÁC TRÊN FILE
Lớp File
Lớp File là một lớp trừu tượng (lớp trừu tượng là lớp không có thực thể thuộc về nó). Lớp File cho phép ta mở, đóng, xoá, hay copy một file từ vị trí này đến vị trí khác trên ổ đĩa.
Lớp File quản lý đọc và ghi các file ASCII, lớp File có 2 lớp con là lớp LineFile và lớp TextFile.
Các yêu cầu của lớp File
LineFile
Lớp LineFile xem mỗi hàng trong file là một phần tử. Dó đó, mỗi lần đọc hay ghi vào file này ta phải thao tác với từng hàng.
f=FileDialog.Show(“*.txt”,”Text file”,”Doc text field”) if (f=nil) then return nil end str=”” afile=TextFile.Make(f,#FILE_PERM_READ) if (afile=nil) then return nil end while (afile.IsAtEnd.Not) str=str + afile.ReadElt end msgbox.info(str,”Noi dung File”)
Câu lệnh afile=TextFile.Make(f,#FILE_PERM_READ) cho phép ta tạo ra một TextFile có thông số truyền vào là đường dẫn của file và tác vụ tương ứng sẽ thực hiện trên file này.
Vòng lặp while (afile.IsAtEnd.not)
Str=str + afile.ReadElt End
sẽ đọc các ký tự trong file cho tới khi gặp ký tự kết thúc file.
Một số yêu cầu trên lớp TextFile
Khi tạo một TextFile ta phải cho biết file đó để đọc, ghi hay vừa đọc vừa ghi. Thông số aFilePerm trong yêu cầu Make nói lên điều này
Giá trị của aFilePerm như sau:
- #FILE_PERM_READ Mở một file có sẵn để đọc
- #FILE_PERM_WRITE Tạo mới một file và ghi vào file này
- #FILE_PERM_MODIFY Mở một file có sẵn và đọc hay ghi trên file này, ghi chỉ cho phép ghi đè lên một ký tự có sẵn, hay ghi tiếp vào cuối file, không cho phép chèn ký tự vào giữa file.
- #FILE_PERM_APPEND Cho phép ghi tiếp vào file có sẵn hay tạo mới
TextFile
Lớp TextFile xem mỗi ký tự trong file là một phần tử. Do đó, mỗi lần đọc hay ghi vào file này ta phải thao tác với từng ký tự một.
Ví dụ sau cho phép ghi tiếp vào một text file có sẵn trên đĩa, nếu file này chưa có trên đĩa thì tạo mới và ghi vào nó.
theLabels={“City”,”State”, “Quanlity”, “Population”} theInput={“Redlands”,”California”,”Good”,”7000”} theFN=FindDialog.Show(“*.txt”,”Text File”,”Specify File”) if (File.Exists(theFN)) then ‘ nếu file đã tồn tại trên ỗ đĩa ‘ mở file và cho phép ghi tiếp vào file theWriteFile=FileLine.Make(theFN,#FILE_PERM_APPEND) if (theWriteFile=nil) then msgbox.info(“Khong the mo file nay”,”Thong bao”) exit end
else ‘ trường hợp chưa có file này trên đĩa
‘ tạo mới file này theWriteFile=LineFile.Make(theFN,#FILE_PERM_WRITE) if (theWrite=nil) then msgbox.info(“Khong the tao file nay”,”Thong bao”) exit end ‘ tiến hành ghi vào file theWriteFile.WritElt(theLabels.Get(0) + “,” ++ theLabels.Get(1) + “,” ++ theLabels.Get(2) + “,” ++ theLabels.Get(3)) theWriteFile.WritElt(theInput.Get(0)+ “,” “++ theInput.Get(1)+” ,” ++ theInput.Get(2) + “,”++ theInput.Get(3)) while (msgbox.YesNo(“Ban ghi tiep khong”,true)) theInput=Msgbox.MultiInput(“Customer name”, “Data”,theLabels,theInput) if (theInput.count=0) then break end theWriteFile.writElt(theInput.Get(0) +”,” ++ theInput.Get(1)+ “,” ++ theInput.Get(2) + “,” “++ theInput.Get(3)) end theWriteFile.close
Một số yêu cầu của lớp LineFile
ODB
ODB (Object Database File) không phải lớp con của lớp File, nó là một loại file đặc biệt. Thông qua ODB file ta có thể ghi các thuộc tính của bất kỳ đối tượng nào trong ArcView xuống file này. File project .apr là một loại của file này.
Ví dụ sau dùng file ODB lưu project hiện tại xuống file có tên là project.apr
myODB=ODB.Make(“project.apr”.AsFileName)
myODB.Add(av.GetProject)
myODB.Commit ‘ ghi toàn bộ tất cả các đối tượng trong project hiện tại xuống file
Bài tập
Bài tập 1:Đọc một file, thay tất cả các ký tự dấu ! trong file bằng ký tự dấu ?.
Bài tập 2:Đếm số dòng trong một File
Bài tập 3:Đọc dữ liệu từ một file có sẵn toạ độ x, y lưu vào một bảng
Ví dụ file a.txt có nội dung như sau
123.45 674.45
4535.54 675.67
9785.22 564.33
Cột đầu được đặt vào trường x, cột 2 được đặt vào trường y.
Bài tập 3:
Lưu tất cả các script được chọn trong project hiện hành vào một thư mục trên ổ đĩa
Bài tập 4:
Lấy tất cả các script trong một thư mục vào project hiện hành
B.LƯU TRỮ VÀ PHÂN PHỐI ỨNG DỤNG
1. LƯU TRỮ ỨNG DỰNG TUỲ BIẾN TRONG EXTENSION
ArcView cung cấp một phương thức khác cho phép tuỳ biến gọi là extension. Extension cung cấp một cách thức tiện lợi cho phép phân phối tập các công cụ cùng với các thành phần cần thiết khác. Lợi ích của extension là có thể load khi cần các công cụ mở rộng. Trong ArcView có một số extension có sẵn như CAD Reader, Digitizer, Network Analyst, Spatial Analyst. Các extension này thêm mới các button và menu vào giao diện ArcView hay cho phép ArcView hiển thị thêm các dạng format dữ liệu như là CAD.
Tạo mới một extension
Viết các Script để tạo extension
Để đơn giản ta xem như extension là một vật chứa các đối tượng (lớp Extension là lớp con của lớp ODB). Để tạo một extension, lấy các đối tượng mà ta muốn từ project như các menu, các button, các script, hay các view đem chúng vào extension. Dưới đây là một script chỉ cách tạo một extension chứa một view, một button mới trên thanh Menubar của view.
theProject=av.getProject ‘ tìm script cài đặt và bỏ cài đặt extension theInstallScript=theProject.FindDoc(“SampleInstallScript”).GetScript theUninstallScript=theProject.FindDoc(“SampleUninstallScript”).GetScript ‘ kiểm tra xem có script cài đặt và bỏ cài đặt chưa if ((theInstallScript=nil) or (theUninstall=nil)) then Msgbox.info(“chưa có script cài đặt và bỏ cài đặt”,”Thông báo”) Return nil End ‘ tạo file extension, file extension thường có đuôi .avx myExtension=Extension.Make(“$HOME/myext.avx”.asFileName”, “Sample extension”, theInstallscript, theUninstallscript,{}) ‘ lấy menu mới tạo và bỏ vào extension theViewMenubar=theProject.FindGui(“View”).GetMenuBar theMenuItem=theViewMenuBar.FindByLabel(“New Menu”) myExtension.Add(theMenuItem) ‘ lấy view có tên là ban do tinh Dong Thap và bỏ vào extension myExtension.Add(theProject.FindDoc(“Ban do tinh Dong Thap”)) ‘ bỏ các script cần thiết vào extension này, giả sử tất cả các Script trong project này đều cần thiết để bỏ vào extension for each d in av.GetProject.GetDocs if (d.Is(SEd)) then myExtension.add(d.GetScript) end end ‘ thêm vào một câu mô tả về extension này, câu này xuất hiện trong dialog xuất hiện extension myExtension.SetAbout(“Đây là một extension”) ‘ chắc rằng ghi tất cả các đối tượng xuống file extension myExtension.Commit
Viết các Script để cài đặt và bỏ cài đặt extension
Extension khi được load vào một project sẽ thêm các đối tượng (menu, button, view…) trong project hiện tại. Để làm được điều này, ta tạo một script cài đặt (install script) chạy khi load script này vào project. Script cài đặt chứa các lệnh Avenue để lấy ra các đối tượng từ extension và đặt chúng vào vị trí tượng ứng trên project hiện thời. Chẳng hạn, đặt menu mới vào thanh Menubar của View và thêm view vào project.
Khi viết script cài đặt, nên nhớ vị trí các đối tượng đã đưa vào extension trước đó để có thể đặt chúng đúng vị trí trong project.
if (av.GetProject=nil) then return nil end ‘ thêm menu vào menu file trong project theMenuBar=av.GetProject.FindGui(“View”).GêtMnuBar theMenu=theMenuBar.FindByLabel(“File”) if (theMenu<>nil) then theMenubar.add(self.Get(0), theMenuBar.GetControls.Find(theMenu)) else theMenuBar.Add(self.Get(0),999) end ‘ thêm menu vào project av.GetProject.AddDoc(self.get(1))
Script cài đặt thêm các đối tượng lưu trong extension vào project hiện tại. Như vậy, điều đầu tiên script cài đặt làm là kiểm tra có project không. Nếu có, script cài đặt tiếp tục thực hiện, trong trường hợp này nó sẽ lấy thanh MenuBar của View và gán vào đó menu mới trong menu File. Nếu menu File không tồn tại (bị xoá hay đổi tên), menu mới sẽ được đặt vào cuối của thanh MenuBar. Điều cuối cùng script cài đặt làm là thêm vào một view mới. Chú ý là script cài đặt không cài đặt vào script hiện tại script nào. ArcView sẽ tự động tìm kiếm tất cả các extension khi tìm một script cần thực thi. Như vậy, các script kết hợp với một extension chỉ cần thêm vào extension khi ta tạo ra nó.
Khi bỏ một extension ra khỏi project, không còn sử dụng nó trong project thì cũng cần bỏ tất cả các đối tượng kèm theo nó. Script sau bỏ menu mới và view khỏi project.
if (av.GetProject=nil) then return nil end if (av.GetProject.IsClosing) then return nil end ‘ bỏ menu theMenuBar =av.GetProject.FindGui(“View”).GetMenuBar theMenuBar.Remove(self.Get(0)) ‘ bỏ view av.GetProject.RemoveDoc(self.Get(1))
Giống như script install, có thể sử dụng extension để tham khảo trực tiếp các đối tượng để bỏ nó khỏi project hiện hiện tại. Theo cách này, không phải lo nếu các đối tượng bị thay đổi bởi người sử dụng (ví dụ như nhãn của menu).
Các script cài đặt và bỏ cài đặt ta phải được dịch trước, dịch các script này sẽ giúp ta loại bỏ các lỗi nếu có trước khi xây dựng extension.
Chạy thử extension
Bây giờ đã có tất cả các script cần thiết để tạo một extension. Chạy script tạo extension để tạo file extension .avx, copy file này vào một trong hai vị trí sau: thư mục ext32 nằm trong thư mục cài đặt của ArcView hay vào thư mục xác định bởi biến môi trường $USEREXT ( vị trí mặc định cho $USEREXT là $HOME). Extension vừa tạo bây giờ xuất hiện trong hộp thoại Extension Dialog.
Tích hợp một extension với các extension khác
Trong ArcView, nhiều extension được load vào cùng một lúc. Điều này có nghĩa có thể phụ thuộc vào các extension khác để cung cấp các chức năng phụ cho extension của ta. Chẳng hạn, xây dựng một extension chứa vài công cụ chuyên biệt hỗ trợ cho extension Network Analyst. Khi sử dụng extension này, muốn ArcView load extension của đồng thời load luôn extension Network Analyst.
Script sau là ví dụ cho phép tạo ra một extension mà nó phụ thuộc vào extension Network Analyst và extension Spatial Analyst
theProject =av.GetProject ‘ lấy script cài đặt và bỏ cài đặt theInstallScript=theProject.FindDoc(“SampleInstallScript”).GetScript theUninstallScript=theProject.FindDoc(“SampleUninstallScript”).GetScript ‘ chỉ ra vị trí của các extension mà extension của mình phụ thuộc vào aExt=”$HOME/ext32/network.avx”.AsFileName bExt=”$HOME/ext32/spatial.avx”.AsFileName ‘ tao danh sách các extension phụ thuộc theDepend={aExt,bExt} ‘ Tạo file extension myExtension=Extension.Make(“$HOME/myext.avx”.AsFileName, “Sample extension”, theInstallScript,theUninstallScrip,theDepend}
Một số yêu cầu của lớp Extension
2. MÃ HOÁ SCRIPT
Khi xây dựng hoàn chỉnh ứng dụng, muốn phân phối ứng dụng của mình cho khách hàng nhưng lại không muốn khách hàng truy cập vào các Script đã viết. Vậy thì phải làm bằng cách nào? ArcView cung cấp cho một lớp để mã hoá các Script đã viết gọi là EncryptedScript. Các Script sau khi được mã hoá sẽ thực thi nhiệm vụ giống như các Script chưa mã hoá, tuy nhiên không thể xem được mã nguồn của chúng. Và khi một Script đã được mã hoá thì không thể giải mã lại được, vì vậy trước khi mã hoá cần phải sao lưu các Script trước.
Đoạn mã sau sẽ tìm và duyệt qua danh sách các Script, sau đó hỏi có muốn mã hoá các Script không ?
theDocs=av.GetProject.GetDocs theSEds = {} ‘ lấy danh sách các Script for each theDoc in theDocs if (theDOC.GetGUI = "Script") then theSEds.Add(theDoc) end end ‘ thực hiện lặp để mã hoá các Script for each i in theSEds ‘ xác nhận mã hoá Script sure = MsgBox.YesNo(" có muốn mã hoá Script "++i.GetName+"?","Mã hoá", False) if ( Not sure) then Continue end ‘ Tạo Script được mã hoá theScript = EncryptedScript.MakeFromScript(i.GetScript) ‘ gán tên cho Script mã hoá trùng với tên Script chưa mã hoá theScript.SetName(i.GetName) ‘ thêm Script mã hoá vào đề án av.GetProject.AddScript(theScript) ‘ xoá Script chưa mã hoá av.GetProject.RemoveDoc(i) end
Các yêu cầu được sử dụng với EncryptedScript
Yêu cầu Kết quả Ý nghĩa
- EncryptedScript.Make (someAvenueSourceCode) EncryptedScript Tạo một Script mới được mã hoá với đoạn mã Avenue.
- EncryptedScript.MakeFromScript (aScript) EncryptedScript Tạo một Script được mã hoá từ một Script có sẵn.
Nguồn:”Bài giảng Lập trình Avenue – GV Nguyễn Văn Xanh – Đại học công nghệ thông tin”