Tag: ArcMap

Default Geoprocessing Symbology

While preparing for a demonstration showcasing some new Geoprocessing tools, I found a way to have the outputs of a tool to use a different default symbol than what ArcMap assigns the result when added to the map.

To do this, in ArcMap, run the tool to get the result you’re looking for, then open the Symbol Selector (single click on the symbol in the TOC). Next, change the symbology for the output to whichever icon/color you’d like to use, here I created a photo icon.  In the Symbol Selector window, click on Save As…

Next, name the newly created symbol with the same name as the output generated from the tool (ex, Photos).

Now, when you run a tool that outputs to that geometry type and name, it will default the symbology to what you created.  The key is it must be the same name every time.

Posted in Electric & Gas, Uncategorized | Tagged , , , | Leave a comment

Managing layer visibility and selections

Managing layer visibility and selections with the table of contents’ List By Visibility mode

The table of contents in ArcGIS 10 has several ways of listing the layers in the map: by drawing order, source location of the data, whether layers are visible, and whether layers are selectable. A particular list type may be more useful than others depending on the current mapping task. For example, List By Drawing Order is best at setting which layers draw on top of others and List By Source works well to help repair broken data links for layers from different workspaces. In an earlier post, I focused on the table of contents’ List By Selectable mode when I wrote about refining the selected features while editing. In this post, I am going to show how I can use List By Visibility to manage layer visibility and selections.

Continue reading

Posted in Editing | Tagged , , , , , , | Comments Off

New ArcGIS Online Basemaps

A couple of nice additions to the ArcGIS for Desktop 10  basemap gallery were made last week:

1. We added an entry for the new Light Gray Canvas basemap which provides a neutral basemap that makes your thematic data really stand out. There are some useful blog posts about this new basemap on the Mapping Center blog

2. We renamed the  ‘Physical’ basemap to ‘Physical and Ocean’ and added the Ocean basemap
into this as a layer. When you add the Physical and Ocean basemap into
your map, you can turn the Ocean basemap on in the entry for this
basemap in the Table Of Contents if you want to see rich detail for the
world’s oceans.

To add  these basemaps into ArcGIS for Desktop 10, choose File > Add
Data > Add Basemap in ArcMap or ArcGlobe. To add them into 9.3 or
9.3.1, choose File > Add Data From ArcGIS Online.
Alternatively, here are the layer packages for the Light Gray Canvas basemap and the Physical and Ocean basemap that you can add directly into your map or globe.

To add these basemaps into your map or globe via the Catalog, make a connection to this ArcGIS server: http://services.arcgisonline.com/arcgis/services
and then add the World_Light_Gray_Base and World_Light_Gray_Reference
services from the Canvas folder, or the Ocean_Basemap service.

Posted in ArcGIS Online | Tagged , , , , , , , , , , , , | Leave a comment

Fresh additions to the ArcGIS.com Editing Labs group

After hearing your feedback at the 2011 Esri International
User Conference, we on the Editing development team have been busy resolving
some of the workflow issues reported with ArcGIS 10. At your request, we have
developed two new tools for creating smooth curves and another one to cut
circular holes in polygons. You can download these tools from our ArcGIS.com
group called Editing
Labs
, which we use as a repository for prototypes and samples to extend the
ArcGIS 10 editing environment (make sure to filter by Show: All Content at the
top of the page). This blog entry highlights the new add-ins available from
Editing Labs.

Curved Construction
Tool

ArcSketch was a free add-on for ArcGIS 9 to support “back of
the napkin,” GeoDesign-style workflows, such as redlining features and
sketching land-use plans. Features could be created quickly by picking a symbol
on a palette, choosing a tool, and clicking the map to draw it. ArcSketch was deprecated
at ArcGIS 10 when this symbol-based feature creation workflow was incorporated
into the core editing experience through feature templates and the Create
Features window.

A user we spoke to at the UC wants to map zones for receiving
aircraft navigation radio signals by connecting known points with smooth
curves. In ArcGIS 9, he used the Curved Polygon tool in ArcSketch to draw these
features, but we were left scratching our heads about how to perform this task as
easily using the construction tools available in ArcGIS 10. So, we got to work
building a new sample for Editing Labs called the Curved Construction Tool.

Once I download and install the Curved
Construction Tool
, the Curved tool appears in the tools list on the Create
Features window when I activate a line or a polygon feature template. The
Curved tool allows me to create lines and polygons with curves that are splined
through fixed points. In my case, I am going to use the Curved tool to connect
points representing water sampling locations at springs (shown by the blue
circles on the map) to draw a polygon of a hydrologic study area.

I start the curved feature with a single click and add
subsequent points with clicks. I can utilize the snapping environment to snap
to the existing sampling point features when setting the locations through
which the curve passes. After I have digitized all the curves, I finish the
sketch. When creating polygon features, they are closed automatically with a
curved segment.

Each location I click becomes a vertex shared by adjacent Bézier
curves. The curve is defined by the locations of those vertices and additional
control points at the end of blue Bézier handles that radiate from each vertex.
If I want to reshape or move the curves manually, I can double-click the
polygon with the Edit tool.

Auto Complete
Freehand Tool

Several users told us they want to use freehand shapes to
create adjoining polygons. For example, members of a wildland search and rescue
group need to draw search areas and add adjacent polygons as the search
expands. The existing Auto Complete Polygon tool appends new polygons next to
existing ones, but the editor has to click to place each vertex. The Freehand
tool, on the other hand, creates smooth curves that follow movements of the
mouse without needing to click to create vertices, but the tool does not append
to existing polygons. Therefore, we developed the new Auto Complete Freehand
tool to combine the functionality of these tools.

As with the other sample, once I download and install the Auto
Complete Freehand Tool
, the new tool appears in the Create Features window
when I activate a polygon feature template. I am going to use the tool to
digitize adjoining polygons representing vegetation types by tracing over a
basemap image. Starting from the boundary of an existing polygon in the same
vegetation layer, I click once to start the freehand line. I do not need to
hold down the mouse button as I am creating the new polygon’s shape. The new
polygon’s boundary follows the movements of my pointer, although I can hold
down the spacebar if I need to snap to an existing feature.

The new polygon’s boundary must cross or touch the existing
polygon edge at least two times.  I just
need to click once to finish drawing the freehand shape and create the feature.
The freehand line is automatically smoothed into Bézier curves, although the
existing segments that are shared with the new feature are not smoothed. The
vegetation polygons now share a border, but the Auto Complete Freehand tool
allows me to avoid digitizing that edge twice or creating overlaps or gaps
between polygons.

Cut Polygons With
Circle Tool

We heard from a couple of users who want to cut a polygon
with the shape of a circle. For example, one user works with farmlands that are
irrigated by center-pivot systems and needs to cut out the circular-shaped
fields from the surrounding acreage. Another user edits circular oil tanks and
wells that should be cut from the well pad features. These users had found a
simple way of doing their tasks in ArcGIS 9, but ArcGIS 10 requires two steps: drawing
a circle feature and using the Editor menu > Clip command to cut out the
circle. In addition, Clip is inadvertently causing them to edit more features
than intended, since it cuts all visible and selectable polygons underneath the
selected feature. After hearing these scenarios, we created the Cut Polygons
With Circle Tool add-in for Editing Labs so these tasks could be performed
easier in ArcGIS 10.

Using the example of center-pivot irrigation fields, I am
going to cut out actively growing crops from the surrounding perimeters.
Center-pivot is a form of crop irrigation in which equipment rotates around a
hub, creating a circular pattern of irrigated cropland that is often visible in
aerial photography. Once I install the Cut
Polygons With Circle Tool
add-in, I need to open the Customize dialog box
in ArcMap and drag the command onto a toolbar, such as the Editor toolbar.

Next, I select the agricultural field and click the Cut
Polygons With Circle tool on the toolbar to which I added it. Using the imagery
as a guide, I click to place the center of the circle at the field’s central
pivot point. I could have also used the A key to enter x,y coordinates for the
center point. A line representing the radius appears inside the circle as I
draw it. I can drag the circle manually, or since I know that the radius of the
field is 200 meters, I can press R and type the value.

After entering the radius, I press ENTER to finish the
circle and cut the polygon. This leaves me with two features: the outer perimeter
that now is a multipart feature with a hole in it and the inner circle. Since
the circle represents the actively irrigated crop area, I update the feature’s attributes
now that it has a land-use type different from the surrounding field.

Giving us feedback
Please let us know what you think of these tools by adding a
comment to their download pages. We have been uploading samples to Editing Labs
regularly, so check back for new additions. When accessing the Editing Labs
group, make sure to filter by Show: All Content at the top of the page. You can
submit general suggestions on how we can improve the editing experience by adding
to the ArcGIS Ideas site or contacting Esri Support. In addition, we encourage
you to join the ArcGIS 10.1 beta
program
to preview and provide feedback on the next release of ArcGIS.

Special thanks to the UC attendees who spent time helping us
understand their needs.

Post from Rhonda G. (Editing Team)

Posted in Editing | Tagged , , , , , , | 1 Comment

New Resources Available for Getting started with Python Map Automation

ArcGIS 10 provides a new Python
mapping module (arcpy.mapping) that allows you to interact with the contents of
map documents and layer files without necessarily needing to interactively open an
ArcMap session.  The methods, properties and functions available in this
new map scripting API enable you, for example, to automate changing data
sources, modify layer properties, export and print maps, as well as automate the
creation of
thematic maps and map series.  Because the new mapping module is part of
the ArcPy geoprocessing framework, scripts can be used within ArcGIS Desktop
but can also be published to ArcGIS Server as geoprocessing services making
it much easier to make mapping and printing capabilities available on the
server.

The following links are resources
that will help you learn more about arcpy.mapping, get access to popular
sample scripts available for download, and
links to new training resources:

Help Resources

  • A new Introduction to
    arcpy.mapping
    help topic is a great starting point. It includes
    links to a new arcpy.mapping tutorial and general guidelines for working with
    arcpy.mapping. ArcGIS Desktop help has a complete section
    dedicated to the ArcPy mapping module. Embedded within the help topics
    are over 100 different, practical help samples that can be copied/pasted into your applications. Be
    sure to review the “Best ways to get started” section.

Sample Applications

  • Approximately 20
    script tools
    that perform routine map and layer management tasks, printing and
    exporting, as well as basic cartographic operations.
    This is an excellent download because it
    includes many practical code samples that perform a variety of tasks and they
    are easy enough to modify for your own purposes.
  • A script
    tool
    that combines Data Driven Pages, arcpy.mapping, and the ReportLab site package to generate a reference map book that includes street index
    pages. It demonstrates how arcpy.mapping can be used to extend Data
    Driven Pages capabilities.
  • A script
    that incorporates Data Driven Pages and arcpy.mapping to build a map series
    that includes dynamic graphic tables. There is a very complete README.doc file
    included with the download that also addresses other useful tips and tricks
    that go along with the application.

 Web Courses

  • Basics of Python (for ArcGIS 10).
    This course teaches fundamental concepts you need to know to create
    Python scripts in ArcGIS. You will learn guidelines for proper Python syntax,
    techniques to troubleshoot common errors, and how to use loops to test for
    conditions and execute different code based on the result.
  • Python Scripting for Map Automation in
    ArcGIS 10
    .
    This course teaches how to automate map production and
    related data management tasks that would be time-consuming and tedious to
    perform manually. You will learn how to work with the mapping module of the
    ArcPy site package to quickly and easily update map layers and map document
    properties, modify map content, and produce individual maps and map books.

 Special thanks to David from the Mapping Team for sharing these links.

Posted in Developer, Python | Tagged , , , , , , , , , , , , , , | Leave a comment

Useful Tip for Flex Viewer Basemaps

I thought I would share a trick that we found recently with you.  Customers have had the desire to zoom in past the current lowest scale offered by the basemaps (1:600 for Bing, for example) in the Flex Viewer (the lower scales were introduced with the 2.3.1 viewer). 

The first step was adding the basemap to ArcMap and publishing a service (note this goes away at 10.1).  This service was cached using the Web Mercator projection ArcGIS Online cache config and then the two lower scales were added.  Tiles were only generated for the 1:400 and 1:200 scales.  Note, these tiles look pixilated but that is preferred versus the text that there are no tiles found or not being able to zoom past 1:600.   

Next you need to tell the Flex Viewer you have a custom range of scales, by default the scales are determined by your basemap (first one), for example the Bing basemap only goes to 1:600 so that’s as far in as you can zoom.  To override that and add 2 additional scales (1:400 and 1:200) you need to add some xml right after the closing </basemaps> in the main config.xml for example:

    <lods><!– show these levels –>

        <lod resolution=”78271.5169639999″ scale=”295828763.795777″/>

        <lod resolution=”9783.93962049996″ scale=”36978595.474472″/>

        <lod resolution=”1222.99245256249″ scale=”4622324.434309″/>

        <lod resolution=”152.874056570411″ scale=”577790.554289″/>

    </lods>

Wondering where you are going to get these values from?  There is a cache definition file for the service that we can copy and paste from, note we need to have every extent listed here, if it’s not listed it will not be available as a scale level to zoom to.  Go to your server and navigate to the ArcGIS server cache directory (C:arcgisserverarcgiscache), in here find the folder containing your cache with additional scales and drill down until you see config.xml.  Open this up in notepad and get ready to copy and paste.  You are interested in everything below <LODInfo>, make sure you start at levelID 0 and grab each and every resolution and scale.

Once that is done you need to add your custom cached map service as an operational layer set to visible=”true”.  This means it will always be on but we’ll only see it when we get down to 1:400 and 1:200, since it will be on top of the actual map service we won’t see those tiles with the messages that there is no data for this extent.

Next, since you don’t want people to be able to turn the cached operational layer off we can exclude it from the layer list widget (the More… dropdown).  Go to your Flex Viewer directory and then widgetslayerlist and open layerlistwidget.xml.  In here just specify the layer name of your cached service (the operational layer), this will prohibit people from being able to uncheck it.

In this example we’re using the Bing basemaps, if you were using others you would need to add additional scales to cover the gap (for example the Esri Topographic map service only goes to 1:1200 in some areas) and would have a situation where it goes from topo or imagery to a streets basemap.

There you go!

Posted in Uncategorized | Tagged , , , , , , , , | Leave a comment

Incorporating snapping into custom tools

If you are writing a custom tool in ArcMap to select features or create geometry a certain way, then you’ll often need to make it snap to existing features on the map. In the past, snapping was restricted to editing and was somewhat cumbersome for developers to implement. However, ArcGIS 10 provides the ArcGIS Snapping Environment, which offers users a simplified experience in ArcGIS Desktop or ArcGIS Engine and gives developers a straightforward application programming interface (API) to enable snapping in custom tools. This blog entry introduces you to the snapping API and provides sample code that demonstrates how you can incorporate snapping into your own tools.

To implement snapping in a tool, there are two options available depending upon if the tool will be used while editing. If your tool will be used both inside and outside an edit session, you can implement snapping directly by going through the snapping extension. If your tool will be used exclusively within an edit session, you can access snapping indirectly through the Editor object, which takes care of most of the initialization work for you.

Implementing snapping via the extension
First, I am going to show you how to access the snapping environment directly using its extension. This is applicable for a tool that can be used both inside and outside of an edit session. To demonstrate this, I develop a simple tool that reports the x,y location of a mouse click at its snapped location.

I start by creating a tool add-in by following the directions from the SDK help topic, Building add-ins for ArcGIS Desktop. Then, with the help of Working with the ArcGIS snapping environment, I add the code required to enable snapping in the tool. After adding a reference to the ESRI Controls assembly, I can access and initialize the snapping environment in my tool’s Click event. For add-in tools, this event is the OnActivate method.

Next, I can use the cursor location returned from the tools MouseMove event and determine if it actually snaps to anything. If it does, then I update a variable with the snapped position.

The complete code sample is shown below.

using ESRI.ArcGIS.Controls;

using
ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geometry;

namespace
ToolWithSnapping

{


public
class
ShowMapCoordinates
: ESRI.ArcGIS.Desktop.AddIns.Tool


{



ISnappingEnvironment m_SnappingEnv;



IPointSnapper m_Snapper;



ISnappingFeedback m_SnappingFeedback;



IPoint m_Position;


public ShowMapCoordinates()


{


}


Protected override
void OnActivate()


{



//Get the snap environment and initialize the feedback



UID snapUID = new
UID();



snapUID.Value =
“{E07B4C52-C894-4558-B8D4-D4050018D1DA}”
;



m_SnappingEnv = ArcMap.Application.



FindExtensionByCLSID(snapUID) as
ISnappingEnvironment;


m_Snapper =
m_SnappingEnv.PointSnapper;



m_SnappingFeedback = new
SnappingFeedbackClass();



m_SnappingFeedback.Initialize(ArcMap.Application,
m_SnappingEnv, true);


}


protected override
void OnMouseMove(MouseEventArgs
arg)


{



//Get the current position in map units



//This is the cursor location before snapping


m_Position
= ArcMap.Document.ActiveView.



ScreenDisplay.DisplayTransformation.ToMapPoint(arg.X, arg.Y);


ISnappingResult snapResult =
null;


//Try to snap the current position


snapResult
= m_Snapper.Snap(m_Position);


m_SnappingFeedback.Update(snapResult, 0);



if (snapResult != null)



//Snapping occurred



//Set the current position to the snapped location



m_Position = snapResult.Location;


}


protected override
void OnMouseDown(MouseEventArgs
arg)


{



System.Windows.Forms.MessageBox.Show(“Map units:rnX: “



+ m_Position.X.ToString() + “rnY: “ +
m_Position.Y.ToString());


}


protected override
void OnRefresh(int
hDC)


{



if (m_SnappingFeedback !=
null)



m_SnappingFeedback.Refresh(hDC);


}


}

}

In my code, the variable m_Position holds the snapped position of the cursor. If my tool were creating geometry or updating screen feedback (such as with INewLineFeedback), then I would use the m_Position variable rather than the mouse position (MouseEventArgs) as the update point.

Implementing snapping in an edit session
As I mentioned before, if you are developing a tool that will be used exclusively in an edit session, implement snapping with the help of the Editor object. The main advantage of doing this is that the Editor will work with either the ArcGIS Snapping Environment or editing classic snapping, but only in an edit session, of course. Classic snapping refers to the snapping functionality that was available during an edit session in ArcGIS 9 and allows you to set up snapping in a more complex manner on a layer-by-layer basis. The ArcGIS Engine edit sketch and any custom tools that derive it are limited to the classic snapping environment.

Generally speaking, there two types of Editor tools you can build: those that use the edit sketch and those that don’t. You would typically use the edit sketch in a tool if you wanted to use the sketch to help you create some geometry or feedback on the screen. You can then take that geometry and use it as the basis to create a feature with it or use it for selections. If you are creating an ArcMap tool that uses the edit sketch, you don’t have to worry about snapping at all since the Editor handles it entirely for you. The edit sketch also comes with its own context menu (the one used by the Polygon or Line construction tools) and shape constructors, so it’s convenient for developers. In ArcGIS 10, you can only build a tool that uses the edit sketch through COM, which creates a .dll.

If you are not using the edit sketch in your tool, which is most likely because it doesn’t provide the geometry you need, then there is a bit more work involved because you have to create your own geometry using mouse clicks and implement snapping yourself. This type of tool can be made into an add-in or COM .dll.

For the sample code, I’ll use the same example of an add-in tool that reports the x,y position of the snapped location. In this case, I only have to reference the Editor and not the Controls assembly to enable snapping.

using
System;

using
ESRI.ArcGIS.Editor;

using
ESRI.ArcGIS.Geometry;

namespace
ToolWithSnappingES

{


public
class
ShowMapCoordinatesES
: ESRI.ArcGIS.Desktop.AddIns.Tool


{



IEditor m_Editor =
null
;



IPoint m_Position =
null
;


public ShowMapCoordinatesES()


{


m_Editor =
ArcMap.Application.FindExtensionByName(“esriEditor.Editor”)
as
IEditor;


}



protected override
bool OnDeactivate()


{



if (m_Position != null)



m_Editor.InvertAgent(m_Position, 0);


m_Position
= null;



return true;


}



protected override
void OnMouseMove(MouseEventArgs
arg)


{



if (m_Position != null)



m_Editor.InvertAgent(m_Position, 0);


m_Position
= m_Editor.Display.DisplayTransformation.ToMapPoint(arg.X, arg.Y);



//Get the snap environment from the editor



ISnapEnvironment se = m_Editor
as ISnapEnvironment;



Boolean snapped = se.SnapPoint(m_Position);



m_Editor.InvertAgent(m_Position, 0);


}



protected override
void OnMouseDown(MouseEventArgs
arg)


{



System.Windows.Forms.MessageBox.Show(“Map units:rnX: “



+ m_Position.X.ToString() + “rnY: “ +
m_Position.Y.ToString());


}



protected override
void OnRefresh(int
hDC)


{



if (m_Position != null)



m_Editor.InvertAgent(m_Position, hDC);


}



protected override
void OnUpdate()


{


Enabled =
(m_Editor.EditState == esriEditState.esriStateEditing);


}


}

}

The code is very similar to the extension example, where the variable m_Position holds the snapped position and would be used to create geometry or update feedback. In this case, I have to be careful with refreshing the feedback. The code calls InvertAgent, which essentially paints the screen with the feedback of a blue dot. To erase the feedback, I need to call InvertAgent again. If I get out of sync, I can be left with feedback graphics on the screen that will not go away until I refresh the screen. Normally, though, if you are working with ArcGIS Snapping, the environment takes care of this for you.

For more information
To learn more about developing with the ArcGIS Snapping environment, see Snapping in ArcGIS in the ArcGIS Developer Help.

To view some example editing tools that incorporate snapping, see the Editing Labs group on ArcGIS.com (make sure to filter by Show: All Content at the top of the page).

Post content from Sean (Editing Team)

Posted in Developer, Editing | Tagged , , , , , , , , , , | Comments Off

Creating Map Books using Data Driven Pages

A few weeks ago, thousands watched a live training seminar on the new Data Driven Pages in ArcGIS 10.  If you missed this excellent live seminar you can watch it on demand from Esri Training.

Description
Using the ArcGIS 10 Data Driven Pages feature, you can quickly and easily create a professional-quality map book from a single map document. This seminar teaches the workflow for using Data Driven Pages. The presenter also covers how to create an index layer from a feature layer and add dynamic text and locator maps to your map pages.

Who Should Attend
GIS professionals and cartographers working in utilities, transportation, public safety, and government mapping agencies and others who need to produce map books.

Key Points
The presenter discusses

  • Data Driven Pages, map books, index feature extents, and geoprocessing tools.
  • The process for building map books.
  • Updating, printing, and exporting map books.

 http://training.esri.com/gateway/index.cfm?fa=catalog.webCourseDetail&courseid=2152

Posted in Developer, Mapping, Python | Tagged , , , , , , , , , , , | 6 Comments

Labeling Parcels

In the parcel fabric, the parcel name text field is used to store the parcel identification number (PIN). This PIN is sometimes called APN (Assessor Parcel Number) or AIN (Assessor Identification Number) and other conventions. This number is usually kept unique by constructing it from the book, page and a sequential number, as well as similar methods. The field might store “264014001” which stands for Book 264 Page 014 Parcel 001 and can be formatted to show “264-014-001”.

Best practices include the use of label classes to show the full PIN when zoomed in and only the last 3 digits when zoomed out.

  • Label expression: to separate the parcel number by dashes you can use a label expression similar to this:  Left([Name],3) & “-” & Mid([Name],4,3) & “-” & Right([Name],3)
  • MapTips:  some users prefer to only label the last 3 digits and use a MapTip to show the parcel number when hovering over the parcel.

 

  • To do so, activate your MapTip in the Layer’s Display Tab.

  

  • To get the MapTip in the example above, use the following expression:
    ” Book: “& Left([Name],3) & vbNewLine & ” Page: “&  Mid([Name],4,3) & vbNewLine & ” APN:  ” & Right([Name],3)

 

Content for this post from Amir (Parcel Editing Team)

Posted in Editing, Local Government, Mapping | Tagged , , , , , | 1 Comment

Labeling Parcel Lines with COGO Dimensions

A parcel map requirements for line dimensions used to be hard to achieve using only labels. This is the reason many user reverted to the use of annotation. But maintaining annotation is labor intensive, designed for a specific scale and prone to user error. Labels, on the other hand, are database driven, can be easily compared with the line’s geometry as part of the QA process and require no maintenance once configured. We spent a few hours configuring the labels for parcel lines and you can see the results below, which are just as good, if not better. This result could have never been achieved without the parcel fabric redundancy of lines and the concept of line-point.
This post can help you configure labels for parcel fabric lines using the standard label engine or the Maplex extension. Even if you are forced to use annotation, you can benefit from this configuration, as labels can easily be converted to annotation. Continue reading

Posted in Editing, Local Government, Uncategorized | Tagged , , , , , , , | Leave a comment