[Ngôn ngữ Avenue #6] Thao tác trên Layout

0
125
Một Layout về cơ bản là một tập các Graphics biểu diễn các thành phần tạo nên bản đồ. Các thành phần thêm vào Layout như khung nhìn (View), biểu đồ (Chart), Shape hoặc ký tự (Text) được lưu trong danh sách Graphics của Layout.

Mô hình trên cho biết cách ArcView tổ chức các Graphics trên Layout. Mỗi một lớp con của lớp Graphic cho biết các thành phần thể hiện của nó trên Layout. Với ViewFrame, có thể thể hiện nội dung của View ra Layout. Với Legend Frame, có thể thể hiện bảng chú giải của các Theme trong View, tương tự cho các thành phần khác như thước tỷ lệ, mũi tên chỉ hướng, …

Tạo Layout

Tương tự như các đối tượng khác của Avenue, để tạo trang Layout gửi yêu cầu Make đến lớp Layout.
theLayout = Layout.Make
cũng có thể thiết lập các thuộc tính của Layout thông qua việc gửi các yêu cầu cùng các đối số đến đối tượng Display của Layout.
Để thiết lập đơn vị của trang Layout, gửi yêu cầu SetUnits cùng với đối số là kiểu đơn vị đến Display của Layout
theLayout.GetDisplay.SetUnits(#UNITS_LINEAR_CENTIMETERS)
Yêu cầu SetPageSize với hai đối số là chiều rộng và chiều cao cho phép thiết lập khổ trang in, lưu ý là hướng của trang in phụ thuộc vào hai đối số này. Nếu chiều rộng nhỏ hơn chiều cao thì trang in sẽ có hướng thẳng đứng, ngược lại trang in sẽ có hướng ngang.
theLayout.GetDisplay.SetPageSize(21@29.7) ‘thiết lập khổ giấy A4 có hướng đứng
theLayout.GetDisplay.SetPageSize(29.7@21) ‘ hướng ngang
Yêu cầu SetGridActive với đối số là true sẽ cho phép hiển thị ô lưới trên Layout, với đối số là false thì sẽ không cho hiển thị.
theLayout.GetDisplay.SetGridActive(true)
Yêu cầu SetUsingPrinterMargins với đối số là true thông báo cho Layout sử dụng lề (Margin) của máy in.
theLayout.GetDisplay.SetUsingMargin(true)
Yêu cầu SetMarginVisible với đối số false báo cho Layout biết là không hiển thị lề của Layout
theLayout.GetDisplay.SetMarginVisible(false)

Thêm khung nhìn vào Layout

ArcView thêm các Graphics như Views, Charts, và Tables vào Layout bằng cách đặt chúng vào các Frame, như ViewFrame, DocFrame.
Để có thể thêm View vào Frame, trước tiên ta cần phải xác định vị trí gốc của ViewFrame cần đặt so với vị trí gốc của trang Layout. Tiếp theo tạo ra ViewFrame có vị trí gốc đó và thiết lập các thuộc tính của View Frame để nó hiển thị được View mong muốn.
Tạo Layout mới có khổ A4
theLayout = Layout.Make
theLayout.GetWin.Open
theDisplay = theLayout.GetDisplay
theDisplay.SetpageSize(21@29.7)
Lấy phạm vi khung viền của Layout
thePageExtent = theDisplay.ReturnPageExtent
Lấy điểm gốc của Layout
thePageOrigin = thePageExtent.ReturnOrigin
Tạo điểm gốc của ViewFrame cách điểm gốc của trang Layout một khoảng bề ngang là 2 cm và bề đứng là 2 cm
theRectOrigin = thePageOrigin + (2@2)
Tạo hình chữ nhật chứa ViewFrame có hai đối số là điểm gốc và chiều rộng cùng chiều dài của ViewFrame
aRect = Rect. Make(theRectOrigin, (8@10))
Tạo mới ViewFrame
theVFrame = ViewFrame.Make(aRect)
Thêm View vào theVFrame
theVFrame.SetView(av.GetProject.FindDoc(“View1”), true)
Đối số true cho biết có sự liên kết động giữa theVFrame và View1. Khi View1 thay đối thì nội dung của theVFrame cũng được thay đổi theo. Nếu đổi thành false thì theVFrame sẽ chỉ hiển thị nội dung hiện thời của View1, nếu nội dung của View1 thay đổi thì nội dung của theVFrame vẫn không thay đổi.
Vẽ theVFrame ra Layout
theLayout.GetGraphics.Add(theVFrame)
theLayout.Invalidate

Thêm bảng và biểu đồ vào Layout

Tương tự như thêm View vào Layout, trước tiên phải tạo ra một Frame từ một hình chữ nhật xác định bề rộng và bề cao của Frame, sau đó thiết lập thuộc tính để thêm đối tượng bảng (Table) hoặc biểu đồ (Chart) vào Frame. Thay vì sử dụng yêu cầu Make gửi đến lớp ViewFrame để tạo Frame, ở đây sử dụng yêu cầu Make và gửi đến lớp DocFrame, kèm thêm đối số thứ hai là table hoặc chart.
theDocFrame = DocFrame.Make(aRect, table)
thêm table1.dbf vào theDocFrame
theDocFrame.SetFrameDoc(av.GetProject.FindDoc(“table1.dbf”))
Lưu ý để theDocFrame hiển thị được nội dung table1.dbf thì bảng này cần phải đang ở trạng thái mở.
cũng có thể thêm chart1 vào theDocFrame với đoạn Script sau
theDocFrame = DocFrame.Make(aRect, chart)
theDocFrame.SetFrameDoc(av.GetProject.FindDoc(“chart1”))

Thêm thước tỷ lệ vào Layout

Khi tạo ra khung thước tỷ lệ, nên liên kết với khung nhìn tỷ lệ trong khung nhìn được diễn giải bằng thước tỷ lệ. Nếu ViewFrame được liên kết động và tỷ lệ của View thay đổi bằng cách phóng to hoặc thu nhỏ, tỷ lệ thước cũng được thay đổi phù hợp. Ta tạo khung định dạng tỷ lệ thước tương tự như cách tạo ViewFrame. Do đó, trong Avenue để kết nối tỷ lệ thước thì trước tiên ta tạo khung định dạng hình chữ nhật và sau đó tạo thước tỷ lệ từ khung định dạng này.
theSbFrame = ScaleBarFrame.Make(aRect)
Liên kết theSbFrame với ViewFrame
theSbFrame.SetViewFrame(theVFrame)
Thiết lập các thuộc tính về kiểu và đơn vị đo cho thuớc
theSbFrame.SetStyle(#Scalebarframe_style_hollow)
theSbFrame.SetUnits(#Units_linear_miles)
theSbFrame.SetIntervals(5)
theSbFrame.SetInterval(20)
theSbFrame.SetDivisions(4)
Vẽ thước ra Layout
theLayout.GetGraphics.Add(thesbFrame)

Thêm Legend vào Layout

Thêm Legend vào Layout cũng tương tự như thêm thước tỷ lệ vào Layout. Đầu tiên cần tạo ra một LegendFrame và sau đó kết hợp nó với một ViewFrame để lấy nội dung Legend.
theLegendFrame = LegendFrame.Make(aRect)
Kết hợp với ViewFrame
theLegendFrame.SetViewFrame(theVFrame)
Vẽ theLegendFrame ra Layout
theLayout.GetGraphics.Add(theLegendFrame)

Thêm mũi tên hướng Bắc vào Layout

Khi thêm mũi tên hướng Bắc vào Layout, ta cần phải chỉ định một hình chữ nhật chứa nó. Tuy nhiên mũi tên hướng Bắc không được tạo ra bằng cách định nghĩa Frame như ViewFrame hay DocFrame mà nó được tạo ra bằng cách khởi tạo từ lớp NorthArrow.
theNArrow = NorthArrow.Make(aRect)
Sử dụng yêu cầu Edit với đối số là một danh sách rỗng gửi đến đối tượng NorthArrow để hiển thị hộp thoại chọn mũi tên hướng Bắc.
okToAdd = theNArrow.Edit({})
Vẽ mũi tên hướng Bắc ra Layout
if (okToAdd) then
theLayout.GetGraphics.Add(theNArrow)
end
Khi thêm mũi tên hướng Bắc vào một trang layout, ArcView sẽ tạo ra một tệp tin north.def trong thư mục $HOME. Tệp tin này là một đối tượng kiểu data base file (ODB) của ArcView, nó lưu trữ các mũi tên hướng Bắc kết hợp với trang Layout.
Thông thường, khi cài đặt ArcView, tệp tin north.def được lưu tại thư mục ETC trong thư mục cài đặt ArcView. Nếu biết rõ mũi tên hướng Bắc nào được sử dụng, không cần hiển thị hộp thoại chọn mũi tên hướng Bắc vẫn có thể lấy được mũi tên hướng bắc từ tệp tin north.def
Sử dụng yêu cầu Open và gửi đến lớp ODB để mở tệp tin north.def
theNArrODB=ODB.Open(“C: ESRIAV_GIS30ARCVIEWETCnorth.def”.AsFileName)
Lấy danh sách các mũi tên hướng Bắc
thelist = theNArrODB.Get(0)
Lấy Graphic mũi tên hướng Bắc, giả sử lấy Graphic có thứ tự số 2 trong danh sách
theNArrowGraphic = thelist.Get(1)
Tạo mũi tên hướng Bắc
theNArrow = NorthArrow.Make(aRect)
Gán theNArrowGraphic cho theNArrow
theNArrow.SetArrow(theNArrowGraphic)
Vẽ theNArrow ra Layout
theLayout.GetGraphics.Add(theNArrow)
 Nếu có một Graphic vẽ một mũi tên hướng Bắc do ta tạo ra, muốn thêm vào danh sách các mũi tên hướng Bắc. Ta thực hiện đoạn Script như sau:
theLayout = av.GetActiveDoc
theSelectedGraphics = theLayout.GetGraphics.GetSelected
if (theSelectedGraphics <> nil) then
NorthArrowMgr.Merge(theSelectedGrahics)
end

Thêm một hình ảnh vào Layout

Thêm một hình ảnh cũng tương tự như thêm một ViewFrame vào Layout. Dùng yêu cầu Make và gửi đến lớp PictureFrame cùng với đối số là một hình chữ nhật, sẽ có được một PictureFrame. Gán đường dẫn của hình ảnh muốn thêm vào Layout cho PictureFrame vừa tạo và vẽ nó lên Layout, sẽ thêm được hình ảnh vào Layout
thePicFrame= PictureFrame.Make(aRect)
myPicture = “C: DitagisDulieuHinhanhhinh1.bmp”.AsFileName
thePicFrame.SetFileName(myPicture)
theLayout.GetGraphics.Add(thePicFrame)

Thêm các ký tự vào Layout

Ta có thể thêm các ký tự vào Layout bằng cách làm việc với GraphicText. Cũng như các Graphics khác bằng cách gửi yêu cầu Make đến lớp GraphicText cùng với hai đối số là chuỗi ký tự và toạ độ gốc của GraphicText trên Layout, thêm chuỗi ký tự vào Layout
theLayout = Layout.Make
theLayout.GetWin.Open
theDisplay = theLayout.GetDisplay
theDisplay.SetpageSize(21@29.7)
thePageExtent = theDisplay.ReturnPageExtent
Lấy điểm giữa của Layout
thePageCenter = thePageExtent.ReturnCenter
Tạo GraphicText tại điểm giữa Layout
theGText = GraphicText.Make (“Ví du ve GraphicText”, thePageCenter)
Thiết lập một số thuộc tính cho GraphicText
theGText.SetAlignment(#TEXTCOMPOSER_JUST_CENTER)
Thiết lập Symbol của GraphicText
theTextSymbol = theGText.ReturnSymbol.Get(0)
theTextSymbol.SetSize (42)
Thiết lập Font cho Symbol
newFont = Font.Make(“.VnTime”, “Normal”)
theTextSymbol.SetFont(newFont)
Thiết lập hướng xoay cho GraphicText là 25 độ
theGText.SetAngle(25)
Vẽ GraphicText ra Layout
theLayout.getGraphics.Add(theGText)

Thêm khung viền vào Layout

Khung viền là một hình chữ nhật thường dùng để bao quanh các đối tượng như ViewFrame, Layout, …
Để tạo ra khung viền cho một đối tượng, cần phải lấy hình biên của đối tượng để tạo ra khung viền.
Ví dụ để tạo khung viền cho một ViewFrame, gửi yều cầu GetBounds đến đối tượng này để lấy hình viền
aRect = theVFrame.GetBounds
Tạo khung viền
theNeatline = GraphicShape.Make(aRect)
Vẽ khung viền ra Layout
theLayout.GetGraphics.Add(theNeatLine)

In Layout

Để in Layout, sử dụng yêu cầu Print và gửi đến đối tượng Layout.
theLayout.Print
Khi in ArcView sẽ sử dụng máy in mặc định mà thiết lập trên máy tính. có thể in một phần của Layout bằng cách thiết lập các tham số Top, Bottom, Left, Right của mục Margin trong hộp thoại PageSetup của Layout trên menu. hoàn toàn có thể viết lệnh Avenue để thực hiện công việc này.
Giả sử muốn in một phần tư ở góc bên trái phía dưới trang Layout
theLayout = av.GetActiveDoc
theDisplay = theLayout.GetDisplay
thePageExtent = theDisplay.ReturnPageExtent
Lấy điểm giữa của Layout
thePageCenter = thePageExtent.ReturnCenter
Lấy điểm gốc của Layout
thePageOrigin = thePageExtent.ReturnOrigin
theHeight = thePageExtent.GetHeight
theWidth = thePageExtent.GetWidth
aHRect = theHeight/2
aWRect = theWidth/2
Tạo hình chữ nhật có gốc trùng với gốc trang Layout, có chiều dài và rộng bằng ½ Layout
aRect = Rect.Make(thePageOrigin, aWRect@aHRect)
Thiết lập Margin cho Layout
theDisplay.SetMargin(aRect)

In Layout

theLayout.Print
 Các yêu cầu thường được sử dụng với Layout

Các yêu cầu thường được sử dụng với ViewFrame

Các yêu cầu thường được sử dụng với DocFrame

 Các yêu cầu thường được sử dụng với PictureFrame

 Các yêu cầu thường được sử dụng với ScalebarFrame

 VÍ DỤ

Ví dụ sau trình bày cách xuất ra Layout bảng báo cáo thông tin của các nhà máy trong tỉnh Đồng Tháp
theView=av.GetActiveDoc
if (theView.is(View).not) then
return nil
end
tb=theView.FindTheme(“Nhamay”).GetFtab
if (tb=nil) then
return nil
end
 
adoc = av.GetProject.FindDoc("Chi tiet nha may") ‘ Tìm Layout có tên là Chi tiết nhà mày
if (adoc=nil) then ‘ trường hợp chưa có Layout này hoặc Layout này bị xoá
aLayOut = Layout.Make ‘ Tạo layout
aLayOut.SetName("Chi tiet nha may")
aDisplay=aLayOut.GetDisplay
adisUnits = aDisplay.GetUnits
aLayOut.getGraphics.Empty ‘ xoá toàn bộ các Graphic nếu có trên nó
‘ thiết lập kích thước của một trang A4
aWidth = Units.Convert(20.9,#UNITS_LINEAR_CENTIMETERS,adisUnits)
aHeight = Units.Convert(32,#UNITS_LINEAR_CENTIMETERS,adisUnits)
aDisplay.SetPageSize(aWidth@aHeight)
aRe=aDisplay.ReturnPageExtent
aoriPage=aRe.ReturnOrigin ‘ Lấy về toạ độ góc trái trên cùng
aT=aRe.gettop
aL=aRe.getleft
aDisplay.SetMargin (aRe)
aDisplay.SetMarginVisible(true)
aDisplay.SetGridVisible (false)
x = Units.Convert(2,#UNITS_LINEAR_CENTIMETERS,adisUnits)
x=aL + Units.Convert(6,#UNITS_LINEAR_CENTIMETERS,adisUnits)
y=aT-Units.Convert(3,#UNITS_LINEAR_CENTIMETERS,adisUnits)
thePoint = point.make(x,y)
txtSet = {}
txtSymbol = TextSymbol.Make
aFont = Font.Make(".VnTimeH","NORMAL")
txtSymbol.SetFont(aFont)
txtSymbol.SetSize(16)
gl = GraphicLabel.MakeWithSym(" Thong tin chi tiet nha may", thePoint, txtSymbol, txtSet)
aRectTxt=gl.GetBounds
aLayOut.GetGraphics.Add(gl)
adoc= aLayOut
else ' Trường hợp đã có Layout sẵn trong Project
txt= adoc.getgraphics.FindByName("chitiet")
 
if (txt<>nil) then
txt.select
adoc.getgraphics.clearSelected
end
end
aDisplay=adoc.GetDisplay
aRe=aDisplay.ReturnPageExtent
aoriPage=aRe.ReturnOrigin
aT=aRe.GetTop
aL=aRe.GetLeft
adisUnits = adoc.GetDisplay.GetUnits
dx = Units.Convert(0.05,#UNITS_LINEAR_CENTIMETERS,adisUnits)
dy = Units.Convert(0,#UNITS_LINEAR_CENTIMETERS,adisUnits) 
x=aL + Units.Convert(3,#UNITS_LINEAR_CENTIMETERS,adisUnits) 
‘ lấy thông tin từ bảng nhà máy 
st=”” 
ften=tb.FindField(“ten”) 
fDiachi=tb.FindField(“diachi”) 
fSanPham=tb.FindField(“sanpham”) 
fNamsx=tb.FindField(“Namsx”) 
for each r in tb 
if (tb.ReturnValue(ften,r)<>””) then 
st=st + tb.ReturnValue(ften,r) + “ | “ + tb.ReturnValue(fDia chi,r) + “ | “ + tb.ReturnValue(fSanpham,r) + NL
end 
end 
st=st.AsTokens (NL) 
count=alist.count 
y=aT -Units.Convert((0.5*count+14),#UNITS_LINEAR_CENTIMETERS,adisUnits) 
thePoint = point.make(x,y) 
txtSet = {} 
txtSymbol = TextSymbol.Make 
aFont = Font.Make(".VnTime","ITalic") 
txtSymbol.SetFont(aFont) 
txtSymbol.SetSize(15) 
gl = GraphicLabel.MakeWithSym(st, thePoint, txtSymbol, txtSet) 
gl.setname("chitiet") 
gl.setAlignment(#TEXTCOMPOSER_JUST_LEFT ) 
aRectTxt=gl.GetBounds 
adoc.GetGraphics.Add(gl) 
adoc.Invalidate 
adoc.GetWin.Open

Bài tập

Bài tập 1:
Viết Avenue tạo một Layout có kích thước là một trang A4, layout này xuất ra bản đồ thể hiện vị trí các nhà máy trong tỉnh Đồng Tháp
Bài tập 2:
Viết Avenue tạo Layout trình bày bảng dữ liệu của lớp truonghoc.shp

Nguồn:”Bài giảng Lập trình Avenue-Nguyễn Thủy Đoan Trang,Trường đại học Nha Trang”

LEAVE A REPLY

Please enter your comment!
Please enter your name here